基于方法结果对ArrayList进行排序

3

我有一个ArrayList中包含以下对象:

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

然而,这种方法并没有起作用。我的猜测是创建一个循环遍历列表并保留最小结果的方法,但我想知道为什么我的方法不起作用,是否仍有优雅的解决方案。(无需通过循环遍历列表来查找最低结果)
2个回答

3
在你的代码中,data.sort((o1, o2) -> (int) p2pDistance(root, o1));你并没有实际比较o1o2。你返回了距离作为比较结果,而比较器应该返回一个负整数、零或正整数,表示第一个参数小于、等于或大于第二个参数。
试着使用data.sort(Comparator.comparingDouble(x -> p2pDistance(x, root))); .comparingDouble的参数是ToDoubleFunction<? super T> keyExtractor,它允许您将任何对象映射到双精度值。

非常感谢,这正是我所寻找的! - Loud Software

2

Comparable需要三个结果之一:

  • 一个负数 - o1 < o2
  • 一个零值 - o1 = o2
  • 一个正数 - o1 > o2

很可能你的distance函数总是返回一个正数。所以你很可能只是颠倒了点的顺序。

看起来你想比较两个点到根的距离,而不仅仅是o1。所以,可以尝试这样做:

return p2pDistance(root, o1) - p2pDistance(root, o2);

这将按照它们到根点(无论是什么)的距离,对列表中的WadingPool对象进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接