Java 当列表中有空值时,如何进行排序

Java 当列表中有空值时,如何进行排序,java,c#,list,spring-boot,sorting,Java,C#,List,Spring Boot,Sorting,我是Java新手,但我正在尝试将C#转换为Java,这里我面临一些排序问题 因为我在上面做了5次循环来生成结果,所以当我的代码第一次出现在这里时,结果将类似于[5,2,3],[null],[null],[null],[null],[null] 所以我想把它排序为result=[2,3,5],[null],[null],[null],[null],[null]。但当我尝试这样做时,我会点击NullPointerException。我猜这是因为我的列表包含空值 Java代码: Arrays.sort

我是Java新手,但我正在尝试将C#转换为Java,这里我面临一些排序问题

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

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

Java代码:

Arrays.sort(结果);
字符串resultSorting=Arrays.toString(结果);
结果[j]=String.join(“,”,结果排序);
如果我能在lambda做到:

var resultSorting=result[j].Split(',).OrderBy(x=>x).ToList();
结果[j]=string.Join(“,”,结果排序);

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

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

幸运的是,流API已经有了一些有用的内置方法以及Comparator

例如,对于您的字符串,我编写了以下内容:


@试验
@DisplayName(“对字符串数组进行排序,第一个或最后一个为空”)
无效飞行架次(){
最后一个字符串[]unsortedArray={“Bob”,null,“Alice”,null,“Charlie”,“Emma”,null,null,“Dave”};
//要使用流进行列表,请使用比较器进行排序,但首先使用空值,然后收集到字符串列表。
最终列表sortedArray=Arrays.stream(未排序的Darray)
.sorted(Comparator.nullsFirst(String::compareToIgnoreCase))
.collect(Collectors.toList());
//断言
String[]expectedResult={null,null,null,null,“Alice”,“Bob”,“Charlie”,“Dave”,“Emma”};
assertEquals(Arrays.asList(expectedResult)、sortedArray);
Assertions.assertNotEquals(Arrays.asList(unsortedArray)、sortedArray);
//或使用nullsLast:
//要使用流进行列表,请使用比较器进行排序,但最后使用空值,然后收集到字符串列表。
最终列表sortedArrayNullsLast=Arrays.stream(unsortedArray)
.sorted(Comparator.nullsLast(String::compareToIgnoreCase))
.collect(Collectors.toList());
//断言
字符串[]expectedResultNullsLast={“Alice”、“Bob”、“Charlie”、“Dave”、“Emma”、null、null、null、null};
assertEquals(Arrays.asList(expectedResultNullsLast)、sortedArrayNullsLast);
Assertions.assertNotEquals(Arrays.asList(unsortedArray)、sortedarraynullslat);
//PS:您可以将流中的字符串列表收集到数组中,而不是。。。
//要使用流进行列表,请使用比较器进行排序,但最后使用空值,然后收集到字符串列表
//以在断言测试中比较它们。
最终字符串[]SortedArray NullSlastasArray=Arrays.stream(unsortedArray)
.sorted(Comparator.nullsLast(String::compareToIgnoreCase))
.toArray(字符串[]::新建);
}

我找到了解决问题的方法

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

//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:这是目前我能想到的唯一解决办法。因此,如果还有更好的解决方案,请随时发表评论,让我了解更多信息:)

请显示一个。请看,您可以使用Arrays.sort()和一个比较器作为第二个参数。写一个接受空值的比较器,一切都会好起来。@Ralf Renz,谢谢你的评论。我尝试过这个解决方案,但排序不起作用,它只接受空值。因为我的列表是
[5,2,3],[null],[null]
而不是
[2,null,null,3,5]
。这就是我不知道该怎么做的问题…好吧。但是,您不希望对数组结果进行排序,而是希望对结果的元素进行排序。在数组上做一个循环,根据每个元素的内容决定是否排序。这对我的情况有效吗?因为数组格式类似于
[3,2,5],[null],[null]
而不是
[2,null,3,null,null,5]
意味着实际上我想对结果的元素排序,而不是数组。因为我一直在尝试在mehthod中构建一些比较器,它只会忽略null值,而不会对元素进行排序?在
[1,9,4],[null],[3,2,5],[null],[null]
的情况下,您希望得到什么结果?
[1,4,9],[null],[2,3,5],[null],[null]
。这是我所期望的结果。