如何始终在排序末尾具有空值

4
我有一组字符串值。我使用比较器按照特定顺序进行排序,如下所示。
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));

我的列表现在有空值,我希望它们始终在最后。我该如何实现这个目标?


3
空值是等于 "" 还是 null?还是两者皆可? - htz
1
我只有“”。没有null。 - Momo
使用两个不同的比较器,而不是 reverseOrder() - Patricia Shanahan
1个回答

7
比较接口返回一个数字,表示两个对象之间的差异。请注意,由于我们总是希望空值在最后,因此必须确保返回的整数值比任何其他值都大(或小),这样所有空值都将被拉到 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)));
                }
            };

Java中的Comparator可以返回0、1或-1,因此我不明白使用Integer.MAX_VALUE和Integer.MIN_VALUE的目的。 - Momo
2
并不总是这样。按照定义,它会针对相等返回0,针对大于返回正数,针对小于返回负数。许多自定义实现确实会执行您所说的操作,并且对于您的情况可以正常工作,但这只是为了保持一致性。 - Sednus
你可以通过返回ModuleConstants.CUSTOM_LIST.indexOf(o1)-ModuleConstants.CUSTOM_LIST.indexOf(o2)来优化这段代码,而不是使用Integer.compareTo,因为你不需要大整数值。 - Sednus
对我来说没问题...我使用了: final List<String> listToSort = Arrays.asList("", "Red", "", "", "Green", "","", "Blue"); - Sednus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接