Недавно начал учить 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);
}
}
Думаю, что задание предполагало всё-таки освоение логики вложенных операторов 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
Такое странное решение, подходящее для случая именно трёх возрастов:
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
можно подобрать гораздо более уместные примеры, чем этот.
просто подскажите - какие еще варианты решения этой задачи можно использовать
Условия нужны, но в этой задаче, мне кажется, проще будет другой подход:
Код:
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
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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты