1.List排序
這個和陣列的排序又不一樣了。
其實Java針對數組和List的排序都有實現,對數組而言,你可以直接使用Arrays.sort,對於List和Vector而言,你可以使用Collections.sort方法。
Java API針對集合類型的排序提供了2個方法:
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.utilil .Comparator)
如果集合裡面的元素都是相同類型的,並且實作了Comparable接口,那麼可以直接呼叫第一個方法。
如果你有其它的排序的想法,例如你不想按照自然排序進行,還可以傳一個Comparator過去,例如反向。
元素不相同的情況比較複雜,可以暫時不用考慮。
總的來說,如果你有一個新的類,例如Player,那麼你要想對其進行排序,就讓其實作Comparable接口,並且實作compareTo方法。例如比想按照年齡的大小來排序,從小的進行,那麼你就實現如下:
public class Player implements Comparable<Player>{ private String name; private int age; public Player(String name, int age){ this.name=name; this.age=age; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } //实现接口方法,将来排序的时候sort看正负数还是零来进行判断大小 @Override public int compareTo(Player player){ return this.getAge() - player.getAge(); } }
Comparable接口默認是按照自然順序進行排列的,當然,你可以出其不意地直接將compareTo方法反著實現,也可以,只是約定上不要這樣,你不混淆,別人可能會混淆的。都照約定來,就不太容易混亂。所以Comparator其實是當你不滿意自然排序的時候,或者說簡單的自然排序無法實現你想要的排序的時候,比如你想按照數值的絕對值大小來進行排序,顯然就沒法用Comparable,你得自己寫一個Comparator的實作類,實作compare方法,按照你想要的方式回傳正數負數或零。
有一些系統自備的Comparator,例如Collections.reverseOrder(), String.CASE_INSENSITIVE_ORDER。
2.Set排序
Java對於Set有依照自然順序排列的實作類,TreeSet,對這個TreeSet物件的引用進行操作就行了,自己就是排好序的。當然,TreeSet也提供了多個建構方法,尤其是接收Comparator類型參數的建構方法,允許開發者按照自己的想法進行排序,而不僅僅是局限於自然排序。
還有一種方式就是將set直接裝進一個list物件裡面,然後使用排序就好。
3.Map排序
這個就稍微麻煩一些了。
Map是鍵值對,所以既可以按照鍵進行排序,也可以依照值進行排序。通常因為鍵不能同,但是值可以同,所以很多都是用值來進行排序。先舉個例子吧。
原理其實最後還是得轉換成List比較方便一些。
Map遍歷的時候要使用一個東西叫做Map.Entry,假如你有一個Map的對象map,那麼你可以使用map.entrySet()來取得一個set對象,裡面裝的都是Map.Entry,如果你想遍歷,很簡單地使用iterator就可以取得裡面的所有元素。如果你要排序,那麼就最好是將這個set裝到一個list裡面去,然後定義一個Comparator對象,在裡面實現compare方法,返回一個差值,比如運動員得分的差值,然後使用Collections.sort方法,將list物件和comparator物件傳進去,排序就完成了。
舉個例子吧
public class MapSort{ public static void main(String[] args){ Map<String, Player> map = new HashMap<String, Player>(); Player p1 = new Player("John", 1000); Player p2 = new Player("Ben", 3000); Player p3 = new Player("Jack", 2000); map.put(p1); map.put(p2); map.put(p3); //将Map里面的所以元素取出来先变成一个set,然后将这个set装到一个list里面 List<Map.Entry<String, Player>> list = new ArrayList<Map.Entry<String, Player>>(map.entrySet()); //定义一个comparator Comparator<Map.Entry<String, Player>> comparator = new Comparator<Map.Entry<String, Player>>(){ @Override public int compare(Entry<String, Player> p1, Entry<String, Player> p2){ //之所以使用减号,是想要按照分数从高到低来排列 return -(p1.getValue().score - p2.getValue().score); } }; Collections.sort(list, comparator); for(Map.Entry<String, Player> entry:list){ System.out.println(entry.getValue().name + ":" + entry.getValue().score); } } } class Player{ String name; int score; public Player(String name, int score){ this.name == name; this.score == score; } }
這樣排序下來,最後就會輸出如下內容
Ben:3000
Jack:2000
的集合排序最後都可以轉換為List的排序,因為Collections本身提供了List排序的支援。 Map可以變成set,set可以變成list,所以都可以變成list。
1.對於最簡單的情況,就是要被排序的類別實現一個Comparable接口,然後實現compare方法,按照自然的方式進行減運算,返回減運算的結果,然後直接使用Collections.sort(List list)方法就行了。這一種叫做自然排序,只適合原始的List和Set。
2.如果你不想使用自然排序,沒問題,那麼就定義一個Comparator對象,將邏輯在那裡面去實現,然後使用Collections.sort(List list, Comparator comparator)。
3.對於Map來說,稍微複雜一點,但是原理也就是第2種情況。