2013-03-13 22 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