使用参考点对 java 中的数组进行排序

Sorting array in java using a reference point

假设我有一个二维坐标 ArrayList,如 L1 和另外两个点 ab.请注意 L1 中的所有坐标都在线段 ab.
上 我想根据与点 a 的距离对 L1 进行排序,以便存储最接近 a 的点首先.
我知道我需要写一个比较器来使用它来排序 L1 但首先,我对比较器接口知之甚少,其次,每次阅读 material 我发现将两个元素相互比较,不像这里我需要第三个元素作为参考点。甚至可以这样做吗?
我将不胜感激阅读 material(对于此类高级分类内容)有关该主题的内容以及您的回答。

这里有两件事:首先是数学。如果我理解正确的话,你实际上是在比较 Math.abs(a-L1)Math.abs(b-L1) 所以我们会有一个像

这样的闭包
myArrayList.sort((a,b) -> Double.compare(Math.abs(a-L1), Math.abs(b-L1)));

但由于 L1 在 lambda 内部使用,它必须有效地最终,因此我们需要将 L1 初始化为最终:

final double L1 = 42;

当然,在您的情况下,您需要用适当的函数替换 Math.abs,该函数测量从点 aL1 的距离,并适当地初始化 L1二维坐标的实例。

通常,Point class(或等效)的距离函数应该是这样的(对于欧氏距离):

public class Point {

    public double distanceFrom(Point other) {
        return Math.hypot(x - other.x, y - other.y);
    }

您可以为比较器创建一个静态工厂:

public static Comparator<Point> comparingDistanceFrom(Point point) {
    return (p1, p2) -> p1.distanceFrom(point) - p2.distanceFrom(point) > 0 ? 1 : -1; 
}

然后相对于某个点进行排序a:

Collections.sort(L1, comparingDistanceFrom(a));

如果由于某种原因您无法在 Point class 中声明 distanceFrom,您可以轻松地将其内联到静态工厂中。