2013-03-13 23 views
2

我有一個字符串值列表。我用一個比較器通過特定的順序對它們進行排序如下如何在排序結束時總是有空值

public static final List<String> CUSTOM_LIST = Arrays.asList("Red", "Green", "Blue"); 
comparator = new Comparator<String>(){ 
      @Override 
      public int compare(final String o1, final String o2){ 
        return Integer.valueOf(CUSTOM_LIST.indexOf(o1)) 
        .compareTo(Integer.valueOf(CUSTOM_LIST.indexOf(o2))); 
       } 
     }; 

所以比較我做

Collections.sort(listToSort,comparator); 

或者反向排序

Collections.sort(listToSort,Collections.reverseOrder(comparator)); 

現在我的名單有空值和我想讓他們永遠在最後。我如何實現這一目標?

+2

是一個等於「」的空值還是爲空?或兩者? – htz 2013-03-13 15:16:07

+0

我只有「」。 no null – outellou 2013-03-13 15:21:42

+0

使用兩個不同的比較器,而不是'reverseOrder()'。 – 2013-03-13 15:26:08

回答

5

比較接口返回一個數字,標記兩個對象之間的差異。請注意,由於始終需要空值到最後,所以我們必須確保返回的整數值大於(或小於)任何其他值,所有空值將被拉至Collection的一角。

comparator = new Comparator<String>(){ 
       @Override 
       public int compare(final String o1, final String o2){ 
        if(o1.isEmpty()) return Integer.MAX_VALUE; 
        else if (o2.isEmpty()) return Integer.MIN_VALUE; 

        else return Integer.valueOf(ModuleConstants.CUSTOM_LIST.indexOf(o1)) 
             .compareTo(
          Integer.valueOf(ModuleConstants.CUSTOM_LIST.indexOf(o2))); 
       } 
      }; 
+0

Java比較器可以返回0,1或-1,所以我不明白使用Integer.MAX_VALUE和Integer.MIN_VALUE – outellou 2013-03-13 16:14:47

+2

的目的並不總是如此。根據定義,返回0表示正數,正數表示更大,負數則返回更小。許多自定義實現都會按照您的說法進行操作,它可以用於您的案例,但僅用於保持一致性。 – Sednus 2013-03-13 16:38:01

+0

您可以通過返回 'ModuleConstants.CUSTOM_LIST.indexOf(o1)-ModuleConstants.CUSTOM_LIST.indexOf(o2)'而不是Integer.compareTo來優化此代碼,因爲您沒有大整數值。 – Sednus 2013-03-13 17:37:04