簡體   English   中英

排序前刪除所有空數組值

[英]Remove all null array values before sorting

我遇到了一些錯誤。 我的數組如下所示:

 String words[] = new String[50000];

要求用戶將值輸入數組

words[i]=c.readLine();

輸入重復的值后,程序將退出無限循環。 現在,程序必須按字母順序對數組進行排序,但是它正在嘗試對某些空值進行排序並返回錯誤。

Arrays.sort(words, String.CASE_INSENSITIVE_ORDER);         
for (int a = 0; a < words.length; a++) {
    c.println(words[a]);
}

僅當用戶輸入正好50000個值時,此程序才有效。 我無法猜測用戶將輸入多少個值,我該如何解決?

我想我必須以某種方式刪除所有空值,然后再按字母順序排序。 有任何想法嗎?

如果不確定size使用ArrayList 不要硬編碼它。

但是,如果您堅持使用array ,可以嘗試:

int notNull=words.length;    
for(int i= 0;i<words.length;i++){
    if(words[i]==null){
        notNull=i;
    break;
}
}
String[] newWords=Arrays.copyOfRange(words, 0, notNull);

newWords數組將是沒有空值的新數組

您可以計算輸入的值,並使用來僅對非空值進行排序

Arrays.sort(words, 0,inputCount, String.CASE_INSENSITIVE_ORDER);

其中inputCount是封裝的while循環的計數。


您還可以修改for循環

for (int a = 0; a < inputCount; a++) {

您可以使用ArrayListSet (或任何其他動態調整大小的集合)來跟蹤實際輸入的字符串數。

如果您要堅持使用預先創建的數組,則可以計算實際讀取的行數,並且最多可以循環到該數量。

輸入字符串時,可以使用二進制插入排序。 這樣可以更快地搜索重復項,並為您提供准備好輸出的有序列表。

有很多選擇,但這似乎不是一個好選擇。 既然您有50000點,那么如果用戶嘗試輸入多於該點會發生什么?

您可以使用java.util.Set來保存您的單詞。 這樣,您不必處理初始化或擴展數組。

不用擔心集合中的空值,可以這樣考慮:

  • 如果要與一個非空值和一個空值進行比較,則以非空值為准。
  • 如果要與兩個非null值進行比較,則兩個都不贏。

您可以創建一個自定義Comparator<String> ,並在Arrays#sort使用它。 String.CASE_INSENSITIVE_ORDERString.CASE_INSENSITIVE_ORDER也是Comparator<String> ,但它並不能完全滿足您的需求。

這是一個示例實現:

public class NullAwareStringComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        if (o1 == null && o2 == null) {
            return 2;
        } else if (o1 == null) {
            return 1;
        } else if (o2 == null) {
            return -1;
        } else {
            return o1.compareToIgnoreCase(o2);
        }
    }
}

然后,您可以這樣調用您的sort方法:

Arrays.sort(words, new NullAwareStringComparator());

這會將所有null值放在數組的末尾。 如果要反向排序,請翻轉compare方法中返回的數字的符號。

另外 ,如果您不知道/不在乎可以保留多少個元素,請考慮改用TreeSet<String> -這具有忽略重復條目的額外好處。

Set<String> sortedStrings = new TreeSet<>(new NullAwareStringComparator());

您還可以使用String.CASE_INSENSITIVE_ORDER作為比較器,因為在這一點上,您幾乎不像以前那樣擔心null條目:

Set<String> sortedStrings = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

...並對集合進行排序,您可以調用Collections.sort()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM