public class Foo implements Comparable<Foo> {
...
private ArrayList<Double> coordinates;
...
}
p2pDistance(Foo x, Foo b)
我想要做的是根据调用p2pDistance(root,elem)
root作为Foo实例而不是原始List中给出的值对列表进行排序。
data.sort((o1, o2) -> (int) p2pDistance(root, o1));
(或等效的非lambda表达式):
data.sort(new Comparator<Foo>() {
@Override
public int compare(Foo o1, Foo o2) {
return (int) Main.this.p2pDistance(root, o1);
}
});
但是,这并没有结束。我的猜测是制作一个循环通过List并保留最小结果的方法,但我想知道为什么我的方法不起作用,如果仍然有一个优雅的解决方案。 (无需遍历列表并找到最低结果)。
在您的代码data.sort((o1, o2) -> (int) p2pDistance(root, o1));
中,您实际上并没有比较o1
和o2
。作为比较的结果,你返回一个距离,而比较器应该返回
第一个参数的负整数,零或正整数小于,等于或大于第二个参数。
尝试使用data.sort(Comparator.comparingDouble(x -> p2pDistance(x, root)));
.comparingDouble
的论点是ToDoubleFunction<? super T> keyExtractor
,它允许您将任何对象映射到double值。
Comparable
想要三个结果中的一个:
o1 < o2
o1 = o2
o1 > o2
据推测,你的distance
函数总是返回正值。所以你可能只是反向订购积分。
你想要的是比较两个点与根的距离,而不仅仅是o1
。所以,像
return p2pDistance(root, o1) - p2pDistance(root, o2);
这将按照它们到根点的距离(无论是什么)对列表中的WadingPool
对象进行排序。