首頁  >  文章  >  Java  >  java集合物件排序

java集合物件排序

伊谢尔伦
伊谢尔伦原創
2016-12-05 11:19:431738瀏覽

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種情況。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn