2014-07-09 87 views
3

在java中我有一個自定義類排序翻番在Java中,我喜歡這個排序是:最好的方法使用Collections.sort

public static void sortList(List<FishCategory> categories) { 
    Collections.sort(categories, new Comparator<FishCategory>(){ 
     public int compare(FishCategory s1, FishCategory s2) { 
      return s1.getName().compareTo(s2.getName()); 
     } 
    }); 
} 

但是像SQL,你可以這樣做:

select * from mytable 
order by id, name 

我想在java中進行雙重排序。我想按這個排序(注:即時通訊使用getParentId)作爲第一類,然後我想按上述排序。

public static void sortList(List<FishCategory> categories) { 
    Collections.sort(categories, new Comparator<FishCategory>(){ 
     public int compare(FishCategory s1, FishCategory s2) { 
      return s1.getParentId().compareTo(s2.getParentId()); 
     } 
    }); 
} 

我不能只是在下一個原因之後運行這兩個函數,這會取消第一個排序。我需要對sql的方式進行排序(即對排序後的組進行排序)。

所以我想先排序.getParentId(),然後.getName()

有沒有人知道一個很容易做到這一點的好方法?

感謝

回答

3

Comparator簡單的修改:

final int diff = s1.getParentId() - s2.getParentId(); 
return diff != 0 ? diff : s1.getName().compareTo(s2.getName()); 

如果getParentId()有差異,排序由它的方式。否則按getName()排序。

正如指出的by this comment by Pshemo,您可以使用替代以下爲diff初始化:

= Integer.compare(s1.getParentId(), s2.getParentId()); 
+0

getParentId返回一個整數,比較不會帶入整數。 – omega

+0

@omega它自動變成一個整型。 java.lang.Integer具有指定的compareto()。 – Unihedron

+0

我試過了。日食抱怨,並說比較不會爲原始類型int工作。 – omega

5

編寫測試這兩個領域,諮詢僅次於如果第一個等於單個比較。將其插入排序。完成。

請注意,如果您想要一個更通用的多級排序解決方案,您還可以編寫一個比較器來封裝兩個比較器(或比較器列表)。

2

首先檢查它使用parentId的,如果它等於然後比較名稱

請參閱下面的代碼:

public static void sortList(List<FishCategory> categories) { 
    Collections.sort(categories, new Comparator<FishCategory>(){ 
     public int compare(FishCategory s1, FishCategory s2) { 
      int diff = s1.getParentId() - s2.getParentId(); 
      if (diff != 0) 
       return diff; 
      return s1.getName().compareTo(s2.getName()); 
     } 
    }); 
} 
+0

's1.getParentId() - s2.getParentId()'由於整數溢出而不是個好主意 –

3

由於Java 8 Comparator具有thenComparing默認方法,您可以在其中添加下一個比較器,如果「原始」比較器將決定值相等,則應使用該比較器。

所以,你的代碼可以像

public static void sortList(List<FishCategory> categories) { 
    Collections.sort(categories, new Comparator<FishCategory>(){ 
     public int compare(FishCategory s1, FishCategory s2) { 
      return s1.getParentId().compareTo(s2.getParentId()); 
     } 
    }.thenComparing(new Comparator<FishCategory>(){ 
     public int compare(FishCategory s1, FishCategory s2) { 
      return s1.getName().compareTo(s2.getName()); 
     } 
    })); 

    Comparator.comparing(FishCategory::getParentId); 
} 

,或者你可以用Comparator.comparing方法,它接受Function返回Comparable場,所以你的情況,你甚至可以使用lambda表達式和喜歡寫東西

更簡化它
public static void sortList(List<FishCategory> categories) { 
    Collections.sort(categories, Comparator 
      .comparing(FishCategory::getParentId) 
      .thenComparing(Comparator.comparing(FishCategory::getName))); 
} 
+1

Fancy Java 8'Comparator' builders! Java 7有沒有類似的選擇? – Unihedron

+0

我實際上使用這個android,並根據這個http://stackoverflow.com/questions/23318109/is-it-possible-to-use-java-8-for-android-development它說java 8是不支持,但這仍然是一個很好的答案。 – omega