Как отсортировать 3 элемента?

191
24 октября 2018, 03:20

Недавно начал учить Java и в качестве практической задачи нужно написать приложение, которое должна сравнивать 3 возраста и выдавать результат, кто самый старший, младший и между ними.

Так же была дана "методичка" в которой изложена суть логики всего этого. Но или я дурак, или лыжи не едут, но именно такое решение задачи мне просто не дается. Я просто путаюсь что с чем уже сравнивал и не могу двинуться дальше.

Я не прошу решения этой задачи, просто подскажите - какие еще варианты решения этой задачи можно использовать ? Метод решения, на котором настаивает учитель мне не подходит.

public class Loader
{
public static void main(String[] args) {
    Integer damirAge = 30;
    Integer tolanAge = 25;
    Integer uraAge = 55;
    Integer oldest;
    Integer youngest;
    Integer middle;
    if (damirAge >= tolanAge && damirAge >= uraAge)
        oldest = damirAge;
    else if (tolanAge >= damirAge && tolanAge >= uraAge)
        oldest = tolanAge;
    else
        oldest = uraAge;
    if (damirAge <= tolanAge && damirAge <= uraAge)
        youngest = damirAge;
    else if (tolanAge <= damirAge && tolanAge <= uraAge)
        youngest = tolanAge;
    else
        youngest = uraAge;
    if (damirAge >= tolanAge && damirAge <= uraAge)
        middle = damirAge;
    else if (tolanAge >= uraAge && tolanAge <= damirAge)
        middle = tolanAge;
    else
        middle = uraAge;
    System.out.println("Most young " + youngest);
    System.out.println("Middle " + middle);
    System.out.println("Most old " + oldest);
}
}
Answer 1

Думаю, что задание предполагало всё-таки освоение логики вложенных операторов if.

По анализу математической подоплёки:
Возможных результатов (перестановок) может быть 6 (если не учитывать случаи равенства). На получение 6 исходов нужно по меньшей мере 2.58 бита информации, т.е. эта задача требует в идеале выполнения не более трёх сравнений. Это в данном случае реализуемо - сравнений будет 2 или 3 (в среднем 2.667):

if A > B:
       if A > C:
              if B > C:
                    A B C
              else:
                    A C B  
        else:    
           C A B
else:
      if B > C:
             if C > A:
                    B C A
             else:
                    B A C
      else:
          C B A              
Answer 2

Такое странное решение, подходящее для случая именно трёх возрастов:

public static void main(String[] args) {
    Integer damirAge = 30;
    Integer tolanAge = 25;
    Integer uraAge = 55;
    Integer oldest = Math.max(Math.max(damirAge, tolanAge), uraAge);
    Integer youngest = Math.min(Math.min(damirAge, tolanAge), uraAge);
    Integer middle = (damirAge + tolanAge + uraAge) - oldest - youngest;
    System.out.println("Most young " + youngest );
    System.out.println("Middle " + middle);
    System.out.println("Most old " + oldest);
}

Поскольку внутри Math.max/min по сути своей является условным выражением, это решение можно передалать под вашу задачу с if/else:

public static void main(String[] args) {
    Integer damirAge = 30;
    Integer tolanAge = 25;
    Integer uraAge = 55;
    Integer oldest;
    Integer youngest;
    Integer middle;
    if(damirAge > tolanAge){
        oldest = damirAge;
    } else {
        oldest = tolanAge;
    }
    if(uraAge > oldest){
        oldest = uraAge;
    }
    if(damirAge < tolanAge){
        youngest = damirAge;
    } else {
        youngest = tolanAge;
    }
    if(uraAge < youngest){
        youngest = uraAge;
    }
    middle = (damirAge + tolanAge + uraAge) - oldest - youngest;
    System.out.println("Most young " + youngest );
    System.out.println("Middle " + middle);
    System.out.println("Most old " + oldest);
}

Но делать нужно конечно через массивы, как ответил @gil9red, на мой взгляд в качестве учебного задания на if/else можно подобрать гораздо более уместные примеры, чем этот.

Answer 3

просто подскажите - какие еще варианты решения этой задачи можно использовать

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

  • Получаем 3 возраста
  • Помещаем их в коллекцию, например в список
  • Сортируем список
  • После сортировки, первым элементом будет самый младший, потом средний и последним старший

Код:

Integer damirAge = 30;
Integer tolanAge = 25;
Integer uraAge = 55;
List<Integer> ages = Arrays.asList(damirAge, tolanAge, uraAge);
System.out.println(ages);  // [30, 25, 55]
// Сортируем
Collections.sort(ages);
System.out.println(ages);  // [25, 30, 55]
Integer youngest = ages.get(0);
Integer middle = ages.get(1);
Integer oldest = ages.get(2);
System.out.println("Most young " + youngest);
System.out.println("Middle " + middle);
System.out.println("Most old " + oldest);

Результат:

Most young 25
Middle 30
Most old 55
Answer 4
Integer damirAge = 30;
Integer tolanAge = 25;
Integer uraAge = 55;
Integer oldest;
Integer youngest;
Integer middle;
if (damirAge >= tolanAge && damirAge >= uraAge){
    oldest = damirAge;
    if (tolanAge >= uraAge){
       middle = tolanAge;
       youngest = uraAge;
    }else{
       middle = uraAge;
       youngest = tolanAge;
    }
}
else if (tolanAge >= damirAge && tolanAge >= uraAge){
    oldest = tolanAge;
    if (damirAge >= uraAge){
       middle = damirAge;
       youngest = uraAge;
    }else{
       middle = uraAge;
       youngest = damirAge;
    }
}else{
    oldest = uraAge;
    if (damirAge >= tolanAge){
       middle = damirAge;
       youngest = tolanAge;
    }else{
       middle = tolanAge;
       youngest = damirAge;
    }
}

Справедливости стоит добавить что данный алгоритм отработает быстрее чем вариант с сортировкой списка, просто потому что не будем выделять место для списка.

В лучшем случае проведем 3 сравнения Integer, в худшем- 5, мат. ожидание примерно равно 4.

READ ALSO
Как проверить подключились ли шрифты CSS

Как проверить подключились ли шрифты CSS

Как проверить подключились ли шрифты CSS или нет?

151
&amp;&amp; и || с разными типами данных

&& и || с разными типами данных

Я только начал изучать JavaScript и прорешивал задачки

242