2016-03-27 26 views
3

Noktaların listesini sıralamalıyım. İlk önce x değerini karşılaştırmalıyım, daha sonra x değerleri eşitse, y değeri. Bu yüzden ben thenComparing yöntemi kullanmak düşündüm:Karşılaştırıcı karşılaştırmasıInt

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

Ama mesaj almaya devam: Uyumsuz türleri: Karşılaştırıcı <Nesne> < Noktası > Karşılaştırıcıya dönüştürülemez.

Bu karşılaştırmayı yapmanın başka yolları da var ve çalışıyor, ancak burada yanlış yaptığımı anlamıyorum.

+0

Belki de yazarak bir noktaya yazmanız gerekir (Nokta). Yine de emin değilim. – Gendarme

cevap

6

Bu kod yaptığı işlerde:

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

Ben sadece açıkça içinde p türünü bildirir comparingInt önce <Point> eklendi lambda. Bu, yöntem zincirinden dolayı Java türden çıkamadığı için gereklidir. İşte

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

yazın sorunsuz çıkarılabilir:

da burada Generic type inference not working with method chaining?


başka alternatiftir bakın. Ancak, çift karşılaştırmayı kullanmanız gerekir, çünkü getX ve getY çift değerleri döndürür. Ben şahsen bu yaklaşımı tercih ederim.

2

deneyin değişen:

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

için
Comparator<Point> cmp = Comparator.comparingInt((Point p) -> p.x).thenComparingInt((Point p) -> p.y); 
+0

Evet, test ettim ve işe yaradı .. –

İlgili konular