【问题标题】:How to always have empty values in the end of a sorting如何在排序结束时始终有空值
【发布时间】:2013-03-13 15:14:15
【问题描述】:

我有一个字符串值列表。我使用比较器按以下特定顺序对它们进行排序

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));

现在我的列表有空值,我希望它们总是在最后。我如何做到这一点?

【问题讨论】:

  • 是空值等于“”还是为空?还是两者兼而有之?
  • 我只有“”。没有空
  • 使用两个不同的比较器,而不是reverseOrder()

标签: java sorting comparator


【解决方案1】:

比较接口返回一个标记两个对象之间差异的数字。请注意,由于总是希望空值放在最后,我们必须确保返回的整数值大于(或小于)任何其他值,这样所有空值都将被拉到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比较器可以返回0,1或者-1,所以我不明白使用Integer.MAX_VALUE和Integer.MIN_VALUE的目的
  • 并非总是如此。根据定义,相等时返回 0,较大时返回正数,较小时返回负数。许多自定义实现按您说的做,它适用于您的情况,但只是为了保持一致性。
  • 您可以通过返回 ModuleConstants.CUSTOM_LIST.indexOf(o1)-ModuleConstants.CUSTOM_LIST.indexOf(o2) 而不是 Integer.compareTo 来优化此代码,因为您不会有大整数值。
  • 为我工作...我用过:final List&lt;String&gt; listToSort = Arrays.asList("", "Red", "", "", "Green", "","", "Blue");
猜你喜欢
  • 2018-11-23
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多