数组的初始化导致循环为空

时间:2017-01-31 07:53:01

标签: java arrays if-statement for-loop

我正在尝试通过将非指定元素复制到新数组中来从数组中删除特定字符。但是,当我初始化新数组时,返回值给了我一堆空值而不是非指定元素数组。

public String[] wordsWithout(String[] words, String target) {
    String store[] = null;
    for(int i = 0; i < words.length; i = i +1){
        store = new String[words.length];
        if(!words[i].equals(target)){
            store[i] = words[i];
        }

    }
    return store;
}

3 个答案:

答案 0 :(得分:2)

您正在循环中初始化结果数组。换句话说,对于循环的每次迭代,您初始化一个新数组,并丢失您对前一个数组所做的更改。您应该在循环外部移动初始化。

但这也会造成问题,因为您无法预先知道所得数组的大小。 Java 8允许您更轻松地编写这样的方法:

public String[] wordsWithout(String[] words, String target) {
    return Arrays.stream(words)
                 .filter(w -> !w.equals(target))
                 .toArray(String[]::new);
}

编辑:

如评论中所述,OP的设计可以保留,结果可以在List中累积。恕我直言,它不那么优雅,但它也适用于旧版本的Java:

public String[] wordsWithout(String[] words, String target) {
    List<String> store = new ArrayList<>();
    for (String word : words) {
        if (!word.equals(target)){
            store.add(word);
        }

    }
    return store.toArray(new String(store.size());
}

答案 1 :(得分:0)

您每次都在for循环中初始化数组。请检查。

答案 2 :(得分:0)

这种情况正在发生,因为你有这一行:store = new String[words.length]。这意味着您正在将新数组初始化为一个words.length元素数组,所有这些元素都默认初始化为null。

我看到的另一个问题是你在循环中初始化你的数组,所以在每次迭代时你都会覆盖你在前一个循环中已经做过的更改(如果是的话)

要复制新数组中的非指定元素,我会像上面提到的@Mureinik一样。