Comparable

  • 9
  • Недоступна
Реализуйте интерфейс Comparable<Beach> в классе Beach. Пляжи(Beach) будут использоваться нитями, поэтому позаботься, чтобы все методы были синхронизированы. Реализуй метод compareTo так, чтобы при сравнении двух пляжей он выдавал: положительное число, если первый первый пляж лучше...
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (328)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
NAO-IT
19 уровень, Красногорск
23 апреля, 13:56
не сразу понял что необязательно выворачивать в elseif а можно в одну строку разложить в пример результат больше нуля значит текущий пляж лучше если меньше хуже
20 апреля, 16:13
Нужно учесть, что оба параметра равноценны. Это - главное Решение может быть, например, такое: return Integer.compare(this.quality,o.quality)+Float.compare(o.distance,this.distance);
Leo
20 уровень, Москва
14 апреля, 18:03
Comparable Bitches Внезапно возникла идея для стартапа :)
Jill Still
19 уровень, Москва
13 апреля, 13:14
То ли у меня валидатор сломался, то ли что, но билась час (причем складывала и вычитала вроде бы правильно), в итоге скопировала несколько решений от людей ниже и ни одно не сработало, например: float result = o.distance - this.distance + this.quality - o.quality; return (int)result; Пишет, Убедись, что метод compareTo возвращает значение 0, если пляжи по количеству "выигранных" критериев - одинаковы
Brain4Real
23 уровень, Москва
5 апреля, 08:26
Вне зависимости от правильности решения, всегда захожу в комментарии, чтобы ничего не упустить 🤓
Михаил
18 уровень, Санкт-Петербург
20 марта, 02:57
Прописал интер Comparable, все наладил. Портянку в compareTo накатал. Логику заложил. Хотел еще зависимость от длины String и благозвучности названия заложить. Перечитал условие - успокоился. Нажал на проверить - был послан на три
(char)
Поскольку уверен в своей правоте, полез читать умные мысли старших товарищей. Понял, что опять велосипед изобрел. Снес так заботливо нарисованный интер - запустил на проверку. Все пролетело как по маслу. Самое полезное, что узнал в этом уроке - Float.compare и Integer. compare.
Влад
26 уровень
5 марта, 10:51
вот очень толковая и понятная статья для тех кто совсем не знаком с Comparator(ом) в Java
Flexo Bending Unit #3370318
23 февраля, 07:36
Вы решили задачу лучше, чем 84% учеников. за 1 попытку 😎 подтверждаю, камрады снизу не обманывают — решение в одну строчку не считая, что во все методы добавляем syncronized
Anonymous #2497433
26 уровень
28 февраля, 14:52
if(this.getQuality() > beach.getQuality() && this.getDistance() < beach.getDistance())
return 1;
else if(this.getQuality() < beach.getQuality() && this.getDistance() > beach.getDistance())
return -1;

return 0;
вот такой не принимал
Flexo Bending Unit #3370318
1 марта, 05:40
естественно не принимал, здесь неверно рассмотрены положения, когда по одному из критериев пляжи равноценны.
Flexo Bending Unit #3370318
1 марта, 05:40
return Integer.compare(this.quality, beach.getQuality()) - Float.compare(this.distance, beach.getDistance());
this. необязательны, просто для наглядности
Anonymous #2497433
26 уровень
1 марта, 08:17
а я их не рассматривал изначально. сначала думал, что нужны оба лучшие показатели, а если хотя бы один отличается, то они равны ну, из условия видно, что если два лучшие показатели this, то вернет 1, иначе если у второго объекта два показателя лучше, то -1, иначе 0, то есть равны
Anonymous #2497433
26 уровень
1 марта, 08:21
сначала не видел разницы с моим вторым решением, но когда расписал ответы, то убедился, что отличаются: если качество this будет лучше, то +1, и, если дистанция лучше, то +1, итого +2 если качество this будет лучше, то +1, и, если дистанция хуже, то -1, итого 0 если качество this будет хуже, то -1, и, если дистанция хуже, то -1, итого -1
Anonymous #2497433
26 уровень
1 марта, 08:23
я правильно понимаю, что compare сравнивает два числа?
Flexo Bending Unit #3370318
1 марта, 08:30
у Integer - свой метод, у Float/Double - свой, но реализация сходная, возвращает -1/0/1, тупо сравнивая
Anonymous #2497433
26 уровень
1 марта, 08:34
ну в общем работает как compareTo
Flexo Bending Unit #3370318
1 марта, 08:37
я прежде чем сдать решение, тестил
Beach beach1 = new Beach ("Palm Beach", 50, 5);
Beach beach2 = new Beach ("Miami Beach", 100, 4);
Beach beach3 = new Beach ("Deerfield Beach", 100, 4);
Beach beach4 = new Beach ("Miami II", 25, 4);

System.out.println(beach1.compareTo(beach2));
System.out.println(beach2.compareTo(beach3));
System.out.println(beach3.compareTo(beach4));
System.out.println(beach1.compareTo(beach4));

System.out.println(beach2.compareTo(beach1));
System.out.println(beach3.compareTo(beach2));
System.out.println(beach4.compareTo(beach3));
System.out.println(beach4.compareTo(beach1));
Алексей
35 уровень, Красноярск
18 февраля, 14:59
Не знаю, чего вы все ругаетесь, нормальная задача. Узнали новый интерфейс Comparable. Пока читал про него, узнал, что он уже имплементирован в Float и Integer. Поэтому решение пишется за 5 минут в одну строку с помощью Float.compare и Integer.compare. Но мне интересно было сделать вручную, поэтому написал метод без встроенных реализаций. Тоже симпатично получилось. Логика следующая: У нас два параметра, после сравнения которых в переопределенном методе compareTo(), нам нужно выбрать победителя. Чтобы не вводить в программу кучу счетчиков, мне хотелось, чтобы после сравнения пары параметров у меня осталось одно из трех чисел: как-то {-1, 0, 1}. Если -1, то первый параметр хуже, если 0, то они равны, если 1, то первый лучше второго. Поэтому просто берем, и вычитаем один из другого, и присваиваем результат переменной, например float resultDistance для расстояния, а int resultQuality для качества. Не забываем, что в случае с расстоянием, чем дальше - тем хуже, поэтому правильно расставляем аргументы: o.distance - distance В результате получаем значение 0, если равны, или какое-то значение разницы, положительное либо отрицательное. Как нам превратить это непредсказуемое число в единицу, однако сохранив его знак? Да просто разделив его на его же модуль! Ответ будет всегда равен единице, но знак сохранится. Делаем проверку, если не равно 0, тогда resultDistance равен resultDistance делим на Math.abs(resultDistance). Повторяем с критерием качества. Осталось только сложить два полученных результата. Все! Пыс.Пыс. А можно послать все к черту, записать одной строкой: int result = Float.compare(o.getDistance(), getDistance()) + Integer.compare(getQuality(), o.getQuality()); и пойти накатить пивка с друзьями!😉
Виктор
20 уровень
10 февраля, 12:17
Мда… после подобных задач чувствуешь себя идиотом. В этой задаче не надо возиться с вычислением средневзвешенной оценки: на сколько один пляж дальше другого, насколько качество одного выше другого и т.п. Тупо сравниваем параметры: у первого лучше – ему плюсик, у второго – ему. У кого больше плюсиков тот и победил. Для самопроверки код для main:
Beach beachOne = new Beach("Лазурный", 200.5f, 6);
Beach beachTwo = new Beach("Золотой", 15.8f, 5);

int i = beachOne.compareTo(beachTwo);
if (i < 0) {System.out.println(i + " : Пляж Золотой лучше");}
if (i > 0) {System.out.println(i + " : Пляж Лазурный лучше");}
if (i == 0){System.out.println(i + " : Пляжи одинаковые");}
Глядя на исходные данные как думаете, какой пляж лучше? Правильный ответ – они равны! Будь до Лазурного хоть 5 км – они равны!