#java #android
Имеется класс:
public class Man (){
private int rating1;
private int rating2;
Man (int rating1, int rating2){
this.rating1 = rating1;
this.rating2 = rating2;
}
public int getRating1(){
return rating1;
}
public int getRating2(){
return rating2;
}
}
Формируется List по rating2 (по убыванию):
public class MyComporatorByRating implements Comparator {
@Override
public int compare(man o1, man o2) {
return Integer.compare(o2.getRating1(), o1.getRating1());
}
}
Что необходимо добавить в MyComporatorByRating, чтобы вначале списка были только
те Man, у которых rating2 от 1 до 5 в порядке возрастания.
Т.е. первыми в списке List были отсортированы Man по значению rating2 от 1 до 5 (значения
rating1 у них игнорируются), а потом все остальные Man по rating1 от 100 до 0 (значение
rating2 у них 0)?
Ответы
Ответ 1
public class Man { private int rating1; private int rating2; Man(int rating1, int rating2) { this.rating1 = rating1; this.rating2 = rating2; } public int getRating1() { return rating1; } public int getRating2() { return rating2; } public CompareWith getCompareWith() { if(rating2 >= 1 && rating2 <= 5) { return CompareWith.RATING2; } return CompareWith.RATING1; } public enum CompareWith { RATING1, RATING2 } } И компаратор: public class MyComporatorByRating implements Comparator{ @Override public int compare(Man o1, Man o2) { if(CompareWith.RATING2.equals(o1.getCompareWith()) && CompareWith.RATING2.equals(o2.getCompareWith())) { return o1.getRating2() - o2.getRating2(); } else if(CompareWith.RATING2.equals(o1.getCompareWith())) { return 1; } else if(CompareWith.RATING2.equals(o2.getCompareWith())) { return -1; } else { return o2.getRating1() - o1.getRating1(); } } } Ответ 2
@Override public int compare(Coordinates o1, Coordinates o2) { int result = Integer.compare(o1.getX(), o2.getX()); if (result != 0) { return result; } return Integer.compare(o1.getY(), o2.getY()); } примерно так. Этот компаратор сравнивает координаты в моём проекте. Сначала сравнивает ось Х, если Х одинаковы, то сравнивает по оси Y. Действуй по аналогииОтвет 3
Если вы используете Java 8+, то можете воспользоваться новыми возможностями: потоками и лямбдами. Ваш код будет гораздо проще: Comparatorcomparator = Comparator.comparing(man -> man.rating2); comparator = comparator.thenComparing(Comparator.comparing(man -> -man.rating1)); Stream manStream = men.stream().sorted(comparator); List sortedMen = manStream.collect(Collectors.toList()); Не нужно никаких отдельных классов и ручного сравнения. Ответ 4
Из Вашего описания следует, что: rating2 є [0, 5], rating1 є [0, 100]. В этом случае, компаратор можно переписать без всякого добавления enum'ов в класс Man. Он будет таким: public class MyComporatorByRating implements Comparator{ @Override public int compare(Man o1, Man o2) { if(o1.getRating2() == 0 && o2.getRating2() == 0){ return -Integer.compare(o1.getRating1(), o2.getRating1()); } else if(o1.getRating2() == 0){ return 1; } else if(o2.getRating2() == 0){ return -1; } else{ return Integer.compare(o1.getRating2(), o2.getRating2()); } } } Также замечу, что оба поля класса Man можно объявить как final (поскольку у Вас нет методов set(), то эти поля неизменяемы).
Комментариев нет:
Отправить комментарий