public class Foo implements Comparable<Foo> {
...
private ArrayList<Double> coordinates;
...
}
p2pDistance(Foo x, Foo b)
我要做的是根据调用p2pDistance(root,elem)
root给出的值对列表进行排序,这是一个不在原始列表中的Foo实例。
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并保留最小结果的方法,但我想知道为什么我的方法不起作用,如果仍然有一个优雅的解决方案。 (无需遍历列表并找到最低结果)。
答案 0 :(得分:3)
在您的代码data.sort((o1, o2) -> (int) p2pDistance(root, o1));
中,您实际上并未比较o1
和o2
。作为比较结果,你返回一个距离,而比较器应该返回
作为第一个参数的负整数,零或正整数 小于,等于或大于第二个。
尝试使用data.sort(Comparator.comparingDouble(x -> p2pDistance(x, root)));
.comparingDouble
的参数是ToDoubleFunction<? super T> keyExtractor
,它允许您将任何对象映射到double值。
答案 1 :(得分:2)
SELECT *
FROM ODS.MKT_DEALER_GET AS t1
INNER JOIN
(SELECT TOP 1 *
FROM ODS.MKT_DEALER_GET) AS t2 ON t.[DEA_id] = ts.[DEA_id]
想要三个结果中的一个:
Comparable
o1 < o2
o1 = o2
据推测,您的o1 > o2
函数始终返回正值。所以你可能只是反向排序点。
您想要的是比较两个点与根的距离,而不仅仅是distance
。所以,像
o1
这将按列表中的return p2pDistance(root, o1) - p2pDistance(root, o2);
对象与根点的距离(无论是什么)对其进行排序。