Отсортируйте массив и получите 3 самых больших элемента

#java #arrays #sorting

#java #массивы #сортировка

Вопрос:

Я начинающий Java-программист. У меня есть это домашнее задание: напишите статический метод, в параметре метода указан массив напитков. Метод возвращает 3 самых больших элемента массива алкогольных напитков.

Мой вопрос: есть ли более короткое решение, как я написал?

     public static void alcoholMax(AlcoholDrink[] t){
    // sort the AlcoholDrink[] t
    Arrays.sort(t, new Comparator<AlcoholDrink>() { 
        // here I try sorting the elements by their alcohol value
        @Override
        public int compare(AlcoholDrink o1, AlcoholDrink o2) {
            int at1 = (int)o1.getAlcohol(); // get the alcohol value
            int at2 = (int)o2.getAlcohol(); // get the alcohol value
            if(at1>at2)
                return -1;
            else if(at1<at2 )
                return 1;
            return 0;
        }
    });
    // get the 3 largest element of the sorted array
    double t0 = t[0].getAlcohol();
    double t1 = t[1].getAlcohol();
    double t2 = t[2].getAlcohol();
    // check, 1st > 2nd > 3rd, if this not true, return with null reference
    if(t0>t1 amp;amp; t1>t2)
        System.out.println(t[0]   "n"   t[1]   "n"   t[2]);
    else
        System.out.println("null");
}

public static void main(String[] args){
    AlcoholDrink[] t = new AlcoholDrink [8];
    // new AlcoholDrink( String Name, String Stripping, int price, double alcohol)
    // these are hungarian wines :). If somebody curious for the languange
    t[0] = new AlcoholDrink("Kék Portói", "0.75 l", 1200, 20.5);
    t[1] = new AlcoholDrink("Kék Oportó", "0.75 l", 1100, 10.5);
    t[2] = new AlcoholDrink("Tokaji Asszú", "0.75 l ", 1600, 14.5);
    t[3] = new AlcoholDrink("Egri Bikavér", "0.75 l", 1500, 23.5);      
    t[4] = new AlcoholDrink("Egri Leányka", "0.75 l", 1100, 8.5);
    t[5] = new AlcoholDrink("Egri Merlot", "0.75 l", 1700, 18.5);
    t[6] = new AlcoholDrink("Egri Medina", "0.75 l", 900, 16.5);
    t[7] = new AlcoholDrink("Törley Talisman", "0.75 l", 750, 4.5);     

    alcoholMax(t);
    // It is always return with "null"
  

Комментарии:

1. Хорошо, я знаю… Я должен изменить возвращаемые значения 🙂 в случаях if 🙂

Ответ №1:

Если ваш getAlcohol() метод возвращает значение double, то вам не следует приводить его к int , это приведет к потере точности. Кроме того, вы можете автоматически сравнивать удвоения вместо того, чтобы делать это самостоятельно, вот так:

 Arrays.sort(t, new Comparator<AlcoholDrink>() { 
        // here I try sorting the elements by their alcohol value
        @Override
        public int compare(AlcoholDrink o1, AlcoholDrink o2) {
           return o1.getAlcohol().compareTo(o2.getAlcohol());
        }
    });
  

Вы также можете заставить свой Alcohol класс реализовать Comparable интерфейс, как показано в этом примере.

Наконец, если вы хотите придерживаться своего собственного кода, вы можете рассмотреть возможность внесения изменений в значение, возвращаемое методом сравнения, следующим образом:

  @Override
        public int compare(AlcoholDrink o1, AlcoholDrink o2) {
            int at1 = (int)o1.getAlcohol(); // get the alcohol value
            int at2 = (int)o2.getAlcohol(); // get the alcohol value
            if(at1>at2)
                return -1;
            else if(at1<at2 )
                return 1;
            return 0;
        }
  

На данный момент я не могу протестировать код, но вы можете сортировать массив по возрастанию.

Комментарии:

1. Да, я реализовал сопоставимый интерфейс в классе Alcohol, но профессор сказал: мы должны реализовать только o1.name.compareto(o2.name ) логика, и не следует использовать o1.getAlcohol().compareTo(o2.getAlcohol());

2. В этом случае вы могли бы переместить логику сортировки в класс Alcohol, а затем вызвать . Сортировка (t). Это должно иметь тот же эффект. Кроме того, если этот ответ решил вашу проблему, пожалуйста, отметьте это так 🙂

Ответ №2:

Я полагаю, что ваш массив сортируется в порядке возрастания.

В этом случае вы хотите получить последние 3 элемента после сортировки или изменить свой компаратор.

Ответ №3:

в вашем компараторе верните -1, если оно меньше, 1, если оно больше, и это должно сработать

Ответ №4:

 First sort the array descending order and get the first three element.

package sortingelementinarray;
public class SortElement 
{
    public static void main(String args[])
    {
        int array[] = {1,6,4,7,2,3};
        int temp;
        for(int j = 0 ; j < array.length; j  )
        {
        for(int i = 0; i < array.length-1; i  )
        {
            if(array[j] > array[i])
            {
                temp = array[j];
                array[j] = array[i];
                array[i] = temp;

            }
        }
        }
        for(int abc : array)
        {
            System.out.println(abc);
        }

    }
}