比较比较Int

问题描述:

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

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

但我不断收到消息:不兼容类型:比较<对象>不能转换到比较<点>。

我还有其他方法可以进行这种比较,它可以工作,但我不明白我在这里做错了什么。

+0

也许你需要通过书写(点)将它投射到一个点上。虽然不确定。 – Gendarme

此代码的工作:

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

comparingInt,其中明确宣布的p类型的前只增加<Point>拉姆达。这是必要的,因为由于方法链,Java无法推断出类型。

参见Generic type inference not working with method chaining?


这里是另一替代:

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

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

尝试改变:

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); 
+0

是的,我做了测试,它工作得很好.. –