比较器比较

时间:2016-03-27 23:41:51

标签: java

我需要对点列表进行排序。首先,我需要比较x值,然后如果x值相等,则y值。所以我以为我会使用thenComparing方法:

Comparator<Point> cmp = Comparator.comparingInt(p -> p.x).thenComparingInt(p -> p.y);

但我一直收到消息:不兼容的类型:比较器&lt;对象&gt;无法转换为比较器&lt; Point&gt;。

我还可以通过其他方式进行比较,但它有效,但我不明白我在这里做错了什么。

2 个答案:

答案 0 :(得分:13)

此代码确实有效:

Comparator<Point> cmp = Comparator.<Point> comparingInt(p -> p.x)
                                  .thenComparingInt(p -> p.y);

我只在<Point>之前添加了comparingInt,它明确声明了lambda中p的类型。这是必要的,因为由于方法链,Java无法推断出类型。

另见Generic type inference not working with method chaining?

这是另一种选择:

Comparator<Point> cmp = Comparator.comparingDouble(Point::getX)
                                  .thenComparingDouble(Point::getY);

这里,可以毫无问题地推断出类型。但是,您需要使用双重比较,因为getXgetY会返回双精度值。我个人更喜欢这种方法。

答案 1 :(得分:3)

尝试更改:

Comparator<Point> cmp = Comparator.comparingInt(p -> p.x).thenComparingInt(p -> p.y);

Comparator<Point> cmp = Comparator.comparingInt((Point p) -> p.x).thenComparingInt((Point p) -> p.y);