繁体   English   中英

当我在列表中有 null 值时如何进行排序

[英]How to do sorting when I have null value in a list

我是 Java 的新手,但我正在尝试将 C# 转换为 Java,在这里我遇到了一些关于排序的问题。

由于我在上面做了 5 次循环来生成结果,所以当我的代码第一次进入这里时, result将类似于[5,2,3], [null], [null], [null], [null]

所以我想将它排序为result = [2,3,5], [null], [null], [null], [null] 但是当我尝试这样做时,我会遇到NullPointerException 我猜这是因为我的列表包含 null 值。

Java 代码:

Arrays.sort(result); 
String resultSorting = Arrays.toString(result);
result[j] = String.join(",", resultSorting);

如果 C# 我可以在 lambda 中做:

var resultSorting = result[j].Split(',').OrderBy(x => x).ToList();
result[j] = string.Join(",", resultSorting);

那么如何在Java中解决这个问题呢?

如果它是 java 对象的集合,则可以实现Comparable接口,该接口用于计算对象的.sort()

幸运的是,Stream API 已经有一些有用的内置方法以及比较器。

例如,对于你的字符串,我写了这个:


@Test
@DisplayName("Sort Array of Strings with Nulls First or Last")
void sorty(){

    final String[] unsortedArray = {"Bob",null,"Alice",null,"Charlie","Emma",null,null,"Dave"};

    //To List with Stream, Sort using Comparator but with nulls first then collect to String list.
    final List<String> sortedArray = Arrays.stream(unsortedArray)
                .sorted(Comparator.nullsFirst(String::compareToIgnoreCase))
                .collect(Collectors.toList());

    //Assertions
    String[] expectedResult = {null,null,null,null,"Alice","Bob","Charlie","Dave","Emma"};
    Assertions.assertEquals(Arrays.asList(expectedResult),sortedArray);
    Assertions.assertNotEquals(Arrays.asList(unsortedArray),sortedArray);

    //Or using nullsLast:

    //To List with Stream, Sort using Comparator but with nulls last then collect to String list.
    final List<String> sortedArrayNullsLast = Arrays.stream(unsortedArray)
                .sorted(Comparator.nullsLast(String::compareToIgnoreCase))
                .collect(Collectors.toList());

    //Assertions
    String[] expectedResultNullsLast = {"Alice","Bob","Charlie","Dave","Emma",null,null,null,null};
        Assertions.assertEquals(Arrays.asList(expectedResultNullsLast),sortedArrayNullsLast);
        Assertions.assertNotEquals(Arrays.asList(unsortedArray),sortedArrayNullsLast);
        
        
    //PS: You can instead of Collect to List of Strings in the Stream to an array instead...

    //To List with Stream, Sort using Comparator but with nulls last then collect to String list. I just did
    // to list to compare them in the assertion tests.
    final String[] sortedArrayNullsLastAsArray = Arrays.stream(unsortedArray)
                .sorted(Comparator.nullsLast(String::compareToIgnoreCase))
                .toArray(String[]::new);
    }

我找到了解决我的问题的方法。

在对结果元素进行排序之前,我会为结果元素拆分逗号,以便它只对元素而不是整个数组进行排序。

//Example of my result
result = [2,5,3], [null], [null], [null], [null];

String tempResult = result[j].replaceAll(",", ""); //After split the comma, result will become [253] instead of [2,5,3], [null], [null], [null], [null];
String[] resultSplitComma = tempResult.split("");
Arrays.sort(resultSplitComma);
String resultSorting = Arrays.toString(resultSplitComma);
result[j] = String.join(",", resultSorting);

在这里,我非常感谢所有试图帮助我的人。

PS:这是我目前能想到的唯一解决方案。 因此,如果有人仍有更好的解决方案,请随时发表评论,让我了解更多信息:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM