【问题标题】:Sorting an ArrayList based on the result of a method根据方法的结果对 ArrayList 进行排序
【发布时间】:2018-08-13 19:40:19
【问题描述】:

我在 ArrayList 中有这些对象:

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

我的主类中有一个方法可以输出两点之间的距离:

p2pDistance(Foo x, Foo b)

我要做的是根据通过调用p2pDistance(root,elem) root 给出的值对列表进行排序,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);
    }
});

但是,这最终不起作用。 我的猜测是制作一个循环遍历列表并保留最小结果的方法,但我想知道为什么我的方法不起作用,以及是否还有一个优雅的解决方案。 (不必遍历列表并找到最低的结果)

【问题讨论】:

    标签: java list sorting arraylist comparator


    【解决方案1】:

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

    负整数、零或正整数作为第一个参数 小于、等于或大于秒。

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

    .comparingDouble 的参数是ToDoubleFunction&lt;? super T&gt; keyExtractor,它允许您将任何对象映射到双精度值。

    【讨论】:

    • 非常感谢,这正是我要找的!
    【解决方案2】:

    Comparable 想要三个结果之一:

    • 一个值 - o1 &lt; o2
    • 一个值 - o1 = o2
    • 一个值 - o1 &gt; o2

    大概,您的distance 函数总是返回一个正值。因此,您可能只是将这些点倒序排列。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多