使用参考点对 java 中的数组进行排序
Sorting array in java using a reference point
假设我有一个二维坐标 ArrayList,如 L1 和另外两个点 a 和 b.请注意 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
,该函数测量从点 a
到 L1
的距离,并适当地初始化 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
,您可以轻松地将其内联到静态工厂中。
假设我有一个二维坐标 ArrayList,如 L1 和另外两个点 a 和 b.请注意 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
,该函数测量从点 a
到 L1
的距离,并适当地初始化 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
,您可以轻松地将其内联到静态工厂中。