排序前删除所有空数组值

时间:2014-04-22 01:00:42

标签: java arrays 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个值时,此程序才有效。我无法猜测用户将输入多少个值,我该如何解决?

我想我必须以字母顺序排序之前以某种方式删除所有空值。有什么想法吗?

5 个答案:

答案 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)

您可以使用ArrayListSet(或任何其他动态调整大小的集合)来跟踪实际输入的字符串数。

如果您想坚持使用预先创建的数组,您可以计算实际读取的行数,并且仅循环到该数量。

您可以在输入字符串时使用二进制插入排序。这将是对重复项的更快搜索,并将为您提供准备输出的有序列表。

有很多选择,但这似乎不是一个好选择。由于你有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()