Предположим, у меня есть ArrayList двумерных координат, таких как L1 и две другие точки a и b. Обратите внимание, что все координаты в L1 находятся на отрезке ab.
Я хочу отсортировать L1 по расстоянию от точки a так, чтобы ближайшие точки к a сохранялись первыми.
Я знаю, что мне нужно написать компаратор, чтобы использовать его для сортировки L1, но, во-первых, я мало знаю об интерфейсе компаратора, а во-вторых, каждый материал для чтения, который я нашел, просто сравнивал два элемента друг с другом, в отличие от здесь, что мне нужен третий элемент как ориентир. Возможно ли вообще такое сделать?
Я был бы признателен за некоторые материалы для чтения (для такого рода расширенной сортировки) по этому вопросу вместе с вашим ответом.
Здесь происходит две вещи: во-первых, это математика. Если я правильно понимаю, вы фактически будете сравнивать Math.abs(a-L1)
и Math.abs(b-L1)
, поэтому у нас будет замыкание, подобное
myArrayList.sort((a,b) -> Double.compare(Math.abs(a-L1), Math.abs(b-L1)));
но поскольку L1
используется внутри лямбды, она должна быть эффективной final, поэтому нам нужно будет инициализировать L1
как final:
final double L1 = 42;
Конечно, в вашем случае вам нужно заменить Math.abs
соответствующей функцией, которая измеряет расстояние от точки a
до L1
, и соответствующим образом инициализировать L1
экземпляром ваших 2D-координат.
@ ARK1375 Вот что делает Double.compare
. Замените Math.abs
функцией расстояния для ваших 2D-точек, и все готово.
Сегодня проверил, все работает, спасибо ;)
Ну не совсем, представьте себе два элемента в L1, такие как p и q, мне нужно сравнить
Math.abs(a-p)
иMath.abs(a-q)
друг с другом, чтобы определить, какой из них стоит первым в отсортированном списке. Обратите внимание, что L1 — это ArrayList точек.