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

时间:2020-12-21 21:36:52

标签: java sorting comparator

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

2 个答案:

答案 0 :(得分:2)

这里有两件事:首先是数学。如果我理解正确,您将有效地比较 Math.abs(a-L1)Math.abs(b-L1),这样我们就会有一个像

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

但是由于 L1 在 lambda 中使用,它必须是有效的 final,所以我们需要将 L1 初始化为 final:

final double L1 = 42;

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

答案 1 :(得分:0)

通常,您的 Point 类(或等效类)的距离函数应该是这样的(对于欧几里德距离):

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));

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