Сортировка массива в java с использованием контрольной точки

Предположим, у меня есть ArrayList двумерных координат, таких как L1 и две другие точки a и b. Обратите внимание, что все координаты в L1 находятся на отрезке ab.
Я хочу отсортировать L1 по расстоянию от точки a так, чтобы ближайшие точки к a сохранялись первыми.
Я знаю, что мне нужно написать компаратор, чтобы использовать его для сортировки L1, но, во-первых, я мало знаю об интерфейсе компаратора, а во-вторых, каждый материал для чтения, который я нашел, просто сравнивал два элемента друг с другом, в отличие от здесь, что мне нужен третий элемент как ориентир. Возможно ли вообще такое сделать?
Я был бы признателен за некоторые материалы для чтения (для такого рода расширенной сортировки) по этому вопросу вместе с вашим ответом.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь происходит две вещи: во-первых, это математика. Если я правильно понимаю, вы фактически будете сравнивать 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-координат.

Ну не совсем, представьте себе два элемента в L1, такие как p и q, мне нужно сравнить Math.abs(a-p) и Math.abs(a-q) друг с другом, чтобы определить, какой из них стоит первым в отсортированном списке. Обратите внимание, что L1 — это ArrayList точек.

ARK1375 21.12.2020 22:57

@ ARK1375 Вот что делает Double.compare. Замените Math.abs функцией расстояния для ваших 2D-точек, и все готово.

Don Hosek 21.12.2020 23:35

Сегодня проверил, все работает, спасибо ;)

ARK1375 24.12.2020 20:33

Другие вопросы по теме