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

时间:2018-03-06 02:30:31

标签: java list sorting arraylist comparator

我在ArrayList中有这些对象:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  

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

尝试使用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); 对象与根点的距离(无论是什么)对其进行排序。