2017-01-31 5 views
-1

指定されていない要素を新しい配列にコピーすることによって、配列から特定の文字を削除しようとしています。しかし、新しい配列を初期化するとき、戻り値は、指定されていない要素配列の代わりにヌル値の束を与えています。配列の初期化によってループがnullになる

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

あなたは 'store(store = new String [words.length];)の初期化をループから外さなければなりません。 – IQV

+0

これは[あなたの他の質問](http://stackoverflow.com/a/41936209/4391450)ですでに述べられています。なぜあなたはこの質問を作成する必要がありましたか? – AxelH

答えて

0

ループを作成するたびに、ループを初期化しています。チェックしてください。

+0

そこだけの問題ではありません。もし彼がループの外側で配列を初期化していて 'words.length'要素をそれに加えていなければ、まだ' null'要素を含んでいます。 –

+0

はい、それに同意しました。 @OlarAndrei –

2

ループ内で結果配列を初期化しています。つまり、ループの繰り返しごとに、新しい配列を初期化し、前の配列に行った変更を失います。初期化をループ外に移動する必要があります。

しかし、結果の配列のサイズを事前に知ることができないため、問題が発生します。 Javaの8はあなたのような方法を書くための非常に簡単な方法を可能にする:

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

EDIT:コメントで指摘したように

、OPのデザインは保存することができ、その結果が内に蓄積することができa 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()); 
} 
+0

ちょうど助言、私は段落と配列の長さの問題について段落を分割します。これは、 'Stream'のようにコードの' toArray'を 'List'を使って解決するので、関連していません。 – AxelH

+0

いいえ、java8はありません。結果の配列。 – Ruben

0

をこれが起こっているあなたは、この行の持っているので:store = new String[words.length]。これは、新しいArrayをwords.length要素の配列に初期化することを意味します。これらの要素はすべて、デフォルトでnullで初期化されます。

私が見る他の問題は、(いずれかを行った場合)あなたは非をコピーするには

をすでに前のループに加えた変更を上書きします各反復でのように、あなたは、ループ内のあなたの配列を初期化していることです新しい配列の中で指定された要素上記の@Mureinikのようにします。

関連する問題