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

问题描述 投票:3回答:2

我在ArrayList中有这些对象:

public class Foo implements Comparable<Foo> {
    ...
    private ArrayList<Double> coordinates;
    ...
}

我在我的主类中有一个方法输出2点之间的距离,称为:

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并保留最小结果的方法,但我想知道为什么我的方法不起作用,如果仍然有一个优雅的解决方案。 (无需遍历列表并找到最低结果)。

java list sorting arraylist comparator
2个回答
3
投票

在您的代码data.sort((o1, o2) -> (int) p2pDistance(root, o1));中,您实际上并没有比较o1o2。作为比较的结果,你返回一个距离,而比较器应该返回

第一个参数的负整数,零或正整数小于,等于或大于第二个参数。

尝试使用data.sort(Comparator.comparingDouble(x -> p2pDistance(x, root)));

.comparingDouble的论点是ToDoubleFunction<? super T> keyExtractor,它允许您将任何对象映射到double值。


2
投票

Comparable想要三个结果中的一个:

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

据推测,你的distance函数总是返回正值。所以你可能只是反向订购积分。

你想要的是比较两个点与根的距离,而不仅仅是o1。所以,像

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

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

© www.soinside.com 2019 - 2024. All rights reserved.