Классы компаратора с полями - PullRequest
3 голосов
/ 18 апреля 2019

В проекте, где используется класс, который реализует интерфейс Comparator, чтобы сравнить некоторые сопоставимые объекты, я заметил, что могу разработать класс, который реализует Comparator<> интерфейс с полями , а затем Override функцию compare(...) и использование полей класса для логики функции сравнения.

, поэтому мне придется вызвать функцию сортировки примерно так:

Collections.sort(someArrayList, new SortClass(argument1, argument2));

Мои вопросы:

  • Насколько часто вы делаете что-то подобное?

  • Считается ли это хорошим дизайном?

  • Предполагая, что я получаю пользовательский ввод, который должен изменить логику сравнения между некоторыми объектами, создаваяновый класс-обёртка (с заданными параметрами) будет ли он рассматриваться как лучшее решение в этом отношении?

В соответствии с запросом мой SortClass (я обобщил его в предыдущем разделе, но вот мойреальный класс сортировки):

public class SortHouses implements Comparator<Hotel> {

    /** if house1 should be before house2 */
    private static final int GT = -1;

    /** if house1 should be after house2 */
    private static final int LT = 1;

    private double latitude;
    private double longitude;

    public SortHouses(double latitude, double longitude){
        this.latitude = latitude;
        this.longitude = longitude;
    }

    @Override
    public int compare(House house1, House house2) {
        double distHouse1 = Math.sqrt((Math.pow((house1.getLatitude() - latitude), 2) +
                                 Math.pow((house1.getLongitude() - longitude), 2)));
        double distHouse2 = Math.sqrt((Math.pow((house2.getLatitude() - latitude), 2) +
                Math.pow((house2.getLongitude() - longitude), 2)));

        if (distHouse1 < distHouse2){
            return GT;
        }
        if (distHose1 > distHouse2) {
            return LT;
        }
        if (house1.getNum() > house2.getNum()){
           return GT;
        }
        return LT;
    }
}

1 Ответ

2 голосов
/ 18 апреля 2019

Как часто это происходит?

Параметризованный компаратор? Не очень часто Обычно вещи сортируются относительно их собственных свойств.

Считается ли это хорошим дизайном?

Да, если вы хотите отсортировать местоположения по расстоянию до эталонного местоположения, то использование параметризованного компаратора кажется хорошим способом сделать это.

Однако я вижу одну вещь, которая мне не нравится. Ваш SortHotelsByProximity на самом деле проводит «секретное» сравнение с POI (точками интереса?) В случае ничьей.

Было бы понятнее и позже дало бы вам больше гибкости, если бы вы перенесли эту логику во второй Компаратор: SortHotelsByPOI. Вы можете комбинировать компараторы для учета ничьих с помощью метода thenComparing, который будет выглядеть примерно так:

hotels.sort(new SortHotelsByProximity().thenComparing(new SortHotelsByPOI()))

Предполагая, что я получаю пользовательский ввод, который должен изменить логику сравнение между некоторыми объектами, создание нового класса-обёртки (с данные параметры) будет рассматриваться как лучшее решение для что значит?

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

...