我遇到了一些错误。 我的数组看起来像这样:
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个值时,此程序才有效。我无法猜测用户将输入多少个值,我该如何解决?
我想我必须以字母顺序排序之前以某种方式删除所有空值。有什么想法吗?
答案 0 :(得分:1)
ArrayList
,请使用size
。不要硬编码。
但如果你坚持使用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
数组将是没有空值的新数组
答案 1 :(得分:0)
您可以使用
计算输入的值并仅对非空值进行排序Arrays.sort(words, 0,inputCount, String.CASE_INSENSITIVE_ORDER);
其中inputCount是封装无限循环的计数。
你也可以修改你的for-loop
for (int a = 0; a < inputCount; a++) {
答案 2 :(得分:0)
您可以使用ArrayList
或Set
(或任何其他动态调整大小的集合)来跟踪实际输入的字符串数。
如果您想坚持使用预先创建的数组,您可以计算实际读取的行数,并且仅循环到该数量。
您可以在输入字符串时使用二进制插入排序。这将是对重复项的更快搜索,并将为您提供准备输出的有序列表。
有很多选择,但这似乎不是一个好选择。由于你有50000个点,如果用户试图输入多个点,会发生什么?
答案 3 :(得分:0)
您可以使用java.util.Set来保留您的言论。这样你就不必处理初始化或扩展数组。
答案 4 :(得分:0)
不要担心集合中的空值,而是这样想:
您可以创建自定义Comparator<String>
,并在Arrays#sort
中使用它。另外,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>
- 这样可以忽略重复的条目。< / p>
Set<String> sortedStrings = new TreeSet<>(new NullAwareStringComparator());
您也可以使用String.CASE_INSENSITIVE_ORDER
作为比较器,因为此时您并不像以前那样担心null
条目:
Set<String> sortedStrings = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
...要对集合进行排序,请拨打Collections.sort()
。