[英]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.