簡體   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