Двойное условие сортировки листа ( Comparator )

Рейтинг: 5Ответов: 3Опубликовано: 02.04.2015

Имеется класс:

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<Man> {

    @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)?

Ответы

▲ 4Принят
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<Man> {

        @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();
            }
        }

    }
▲ 1
@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. Действуй по аналогии

▲ 1

Если вы используете Java 8+, то можете воспользоваться новыми возможностями: потоками и лямбдами. Ваш код будет гораздо проще:

Comparator<Man> comparator = Comparator.comparing(man -> man.rating2);
comparator = comparator.thenComparing(Comparator.comparing(man -> -man.rating1));

Stream<Man> manStream = men.stream().sorted(comparator);
List<Man> sortedMen = manStream.collect(Collectors.toList());

Не нужно никаких отдельных классов и ручного сравнения.