[英]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++) {
您可以使用ArrayList
或Set
(或任何其他動態調整大小的集合)來跟蹤實際輸入的字符串數。
如果您要堅持使用預先創建的數組,則可以計算實際讀取的行數,並且最多可以循環到該數量。
輸入字符串時,可以使用二進制插入排序。 這樣可以更快地搜索重復項,並為您提供准備好輸出的有序列表。
有很多選擇,但這似乎不是一個好選擇。 既然您有50000點,那么如果用戶嘗試輸入多於該點會發生什么?
您可以使用java.util.Set來保存您的單詞。 這樣,您不必處理初始化或擴展數組。
不用擔心集合中的空值,可以這樣考慮:
您可以創建一個自定義Comparator<String>
,並在Arrays#sort
使用它。 String.CASE_INSENSITIVE_ORDER
, String.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.