2012-11-14 204 views
8

我知道Collections.sort(myArrayList)可以按字母順序排列一個排列列表,當它們是字符串時,但是當它們是更復雜的東西時,如包含兩個或更多變量的數據對象(包括String),該怎麼辦。有沒有辦法對它們進行排序呢?按字母順序排列複雜對象的排列列表

如果沒有辦法與Collections那麼我可以想象一個for循環或標準排序算法來查看每個對象的字符串變量並移動數組中的對象的索引。

但我想知道,如果主要是我忽略了一些關於Collections方法

+0

番石榴圖書館具有很大亂的-box支持創建複合比較器。一探究竟。 –

+0

這也http://stackoverflow.com/questions/2839137/how-to-use-comparator-in-java-to-sort – Adrian

+0

可能有助於讀的JavaDoc將指向您在正確的方向。 – Raedwald

回答

26

使用the function taking as second parameter a Comparator

伊爾允許你通過比較實例根據您的需要進行排序。請注意,javadoc of Comparator包含有關構建比較器的指導原則。

您可以定義比較器作爲一個匿名類,如果它只能在本地使用。這裏就是我排序的對象關於他們的領域之一是一個字符串的例子:

Collections.sort(groupResults, new Comparator<ProductSearchResult>() { 
    public int compare(ProductSearchResult result1, ProductSearchResult result2) { 
     return result1.product.getRsId().compareTo(result2.product.getRsId()); 
    } 
}); 

或者,你也可以讓你的類實現Comparable接口,但是這使得只有當你可以定義一個自然感(明顯)命令。

+1

另外,關於實現Comparable,如果您總是希望以相同的方式排列類型列表,這是有道理的。如果你想在不同的情況下進行不同的排序,將比較器傳遞到Collections.sort()可能是一種好方法。 –

+2

感謝這是我見過的比較器最重要的例子 – CQM

12

我想創建一個內部類實現Comparator接口:

public class Car { 
public double horsePower; 

class CarHorsePowerComparator implements Comparator<Car> { 
    @Override 
    public int compare(Car car1, Car car2) { 
     return Integer.valueOf(car.horsePower).compareTo(Integer.valueOf(car2.horsePower))   } 
    } 
} 

現在,當你想通過馬力排序您的汽車名單:​​

List<Car> list = new ArrayList<Car>(myCars); //your Car list 
Collections.sort(list, new CarHorsePowerComparator());