【问题标题】:Sorting half empty array in java [duplicate]在java中对半个空数组进行排序[重复]
【发布时间】:2015-07-18 06:48:21
【问题描述】:

您好,我想对字符串数组进行排序

String[] listaU = new String[3];

使用

Arrays.sort(listaU);

当我使这个数组变满时它工作得很好,但是当我只添加 2 个字符串时它就不起作用了。有没有办法对未“完成”的数组进行排序?

【问题讨论】:

  • 你希望得到哪种排序结果?
  • 您是否考虑过将数组初始化为将排序到最后(或开头)的值?
  • 使用 java-8,您可以使用 Arrays.sort(listaU, Comparator.nullsFirst(Comparator.naturalOrder()));nullsLast

标签: java arrays string


【解决方案1】:

使用Arrays.sort(Object[] a, int fromIndex, int toIndex) 方法。

【讨论】:

  • 如果 OP 只设置第一个和最后一个元素怎么办?
  • 那么 OP 应该写一个更好的问题 :-)。
  • 问题并没有说元素是相关的,所以你必须更好地阅读
  • "那么 OP 应该写一个更好的问题 :-)" 问题是可以的,如果您需要 OP 提供的更多信息,请在评论中询问。
  • 我不明白。默认情况下,如果您在数组中保留空值,则 Arrays.sort(Object[]) 将失败并出现 NullPointerException。您可以使用 fromIndex/toIndex 将排序限制为包含非空值的数组子集。
【解决方案2】:

Arrays.sort 只能用于Comparable(包含compareTo)方法的元素数组。

对象数组(如字符串)也被nulls 填充,你不能调用

null.compareTo("foo");

因为null 没有任何类型,这也意味着没有方法。当我们尝试执行此类代码时,它会简单地抛出NullPointerException

您需要做的是使用Arrays.sort(array, comparator),您的比较器将处理比较nulls 的情况。

假设我们想将所有nulls 移动到数组的末尾。让我们也假设不区分大小写的元素顺序。在这种情况下,您的代码可能看起来像

Arrays.sort(arr, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        if (o1 == null && o2 == null)   return 0;// no swap needed
        if (o1 == null)                 return 1;// null is bigger, swap left with right
        if (o2 == null)                 return -1;// null is smaller
        return String.CASE_INSENSITIVE_ORDER.compare(o1, o2);
    }

});

由于Java 8 以上代码可以简化为

Arrays.sort(arr, Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER));

【讨论】:

    【解决方案3】:

    实现您自己的比较器,根据需要处理null,例如:

    String[] listaU = new String[3];
    
    // add elements you need
    
    Arrays.sort(listaU, new Comparator<String>() {
        public int compare(String s1, String s2) {
            if (s1 == null && s2 == null) return 0;
            if (s1 == null) return 1;
            if (s2 == null) return -1;
            return s1.compare(s2);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多