2015-03-13 44 views
-2

上不起作用我在繪圖器中使用List<Point2D.Double> serie來存儲點座標。當我要排序,我決定用Collections.sort(serie)但它表明,有喜歡Collections.sort在List <Point2D.Double>

一個錯誤不能有雙重類型

所以,我怎麼能排序List<Point2D.Double>通過x座標?

+0

我們展示了異常 – 2015-03-13 10:53:12

+2

「,但它顯示了有一個錯誤「你需要更具體。 (1)讓其他有類似錯誤的人發現你的問題和可能的答案(2)讓那些知道這樣的錯誤意味着在需要創建代碼之前寫下答案的人將會重現你的問題。 – Pshemo 2015-03-13 10:53:25

+2

你有編譯錯誤嗎?如果是這樣,你需要提供一個自定義的比較器,因爲'Point2D.Double'類沒有實現'Comparable'接口。 – kraskevich 2015-03-13 10:54:17

回答

4

Collections.sort(List<T>)documentation你可以看到

列表中的所有元素都必須實現Comparable接口

這是由

01執行
public static <T extends Comparable<? super T>> void sort(List<T> list) 

所以名單應該宣佈爲存儲延伸/實現ComparablePoint2D.Double沒有實現Comparable類型的元素,所以它不是有效的類型。

對於這種情況下的Java增加

public static <T> void sort(List<T> list, Comparator<? super T> c) 

方法,它允許你創建你自己的比較,所以你可以比較不實現Comparable,或者他們比預定義不同的方式比較元素。

所以,你的代碼可以像

Collections.sort(serie, new Comparator<Point2D.Double>() { 
    public int compare(Point2D.Double p1, Point2D.Double p2) { 
     return Double.compare(p1.getX(), p2.getX()); 
    } 
}); 

,或者你可以把它寫在Java中8像

Collections.sort(serie, Comparator.comparingDouble(Point2D.Double::getX)); 

甚至

serie.sort(Comparator.comparingDouble(Point2D.Double::getX)); 
+0

非常感謝,它的工作原理!有時我很難閱讀英文API(英文不是我的母語) – Denis 2015-03-13 13:01:20

+0

@Denis是的,我明白你的意思。 API傾向於以完全理解它的方式編寫,這需要我們額外的測試代碼以確保我們理解正確:) – Pshemo 2015-03-13 14:19:33

2

Point2D不實現Comparable接口。您需要創建一個自定義Comparator執行你想要的操作,並把它傳遞給sort方法與你的列表一起,例如...

Collections.sort(serie, new Comparator<Point2D.Double>() { 
    public int compare(Point2D.Double p1, Point2D.Double p2) { 
     return (int)(p1.getX() - p2.getX()); 
    } 
}); 
+0

但是不是Point2D.Double是Double一個定義爲Point2D內部類的類。 Point2D是否需要內部的比較器/可比較的或Double類? – muasif80 2015-03-13 11:04:14

+0

@ muasif80:'Point2D.Double'既是一個嵌套類又是'Point2D'的子類,所以哪個類沒有實現'Comparable'(都不要),因爲*點沒有自然訂單一般*。 – Holger 2015-03-13 11:22:10

+0

嗯,你有一個Point2D.Double的實例,所以這確保只有Point2D.Double可以進行比較。你想比較Point2D的任何實例,你可以改變比較器的匹配要求() – MadProgrammer 2015-03-14 00:19:49

相關問題