1

グローバル配列「単語」から削除するために、文字列単語を引数として取るこのメソッド remove() を作成していますが、何らかの理由で NullPointerException が発生し続け、何時間もスタックしています。

基本的に、単語が最初の位置にあるかどうか、そうでない場合は最後の位置にある場合、またはどちらにもない場合はすべての配列をチェックし、単語の位置の前に前半を追加してから追加します配列内の単語の位置の後の後半、それをスキップして「削除」します。しかし、配列内の単語の位置を探している for ループで NullPointerException を取得しています。メソッドのコードは次のとおりです。

public void remove(String a){

String[] temp_arr = new String[words.length-1]; // make array with 1 less length for deleted 

    if(words[0].equals(a)){ // if the word is the first in the array

        for(int x=0, z=1; x<temp_arr.length; x++,z++)
            temp_arr[x]=words[z];

        words = temp_arr;

    } else if(words[words.length-1].equals(a)){ // if the word is in the last position of the array

        for(int x=0, z=0; x<temp_arr.length; x++,z++)
            temp_arr[x] = words[z];

        words = temp_arr;

    } else{ // if the word is in neither first or last position of array

        // THIS IS WHERE the exception is thrown, in this for loop, in the if(words[k].equals(a))

        int k=0;
        for (; k<words.length; k++){ // find the position of the word to delete
            if (words[k].equals(a)) {
                break;
            }
        }

        for (int i = 0; i < k-1; i++){ // add first part of array before the word

            temp_arr[i] = words[i];
        }

        for(int c = k, b = k+1; c< temp_arr.length; c++,b++){
            temp_arr[c] = words[b];
        }

        words = temp_arr; // assign the new values to global array

    }
}

また、適切なコーディング方法について何か提案があれば、よろしくお願いします!

** このメソッドのデータ構造として配列のみを使用できます。

4

4 に答える 4

2

このように条件を変更します

a.equals(単語[0])

文字列値 a を知っているためです。しかし、配列からどのような値が得られるかはわかりません。したがって、null 値でも配列から取得され、null ポインター例外が許可されます。

于 2012-12-14T01:36:37.317 に答える
1

私はあなたのコードを実行し、いくつかのエラーを見つけました。コアのアイデアを変更せずに何かを修正します: } else { //単語が配列の最初または最後の位置にない場合

        // THIS IS WHERE the exception is thrown, in this for loop.

        int k = -1;
        for (int i = 0; i < words.length; i++) { // find the position of the word to delete
            if (words[i].equals(a)) {
                k=i;
                break;
            }
        }
        if(k<0)//if not exists
            return;

        for (int i = 0; i < k /*- 1*/; i++) { // add first part of array before the word

            temp_arr[i] = words[i];
        }

        for (int i = k; i < temp_arr.length; i++) {
            temp_arr[i] = words[i+1];
        }

        words = temp_arr; // assign the new values to global array

    }

元の配列に null 要素を含めることができない場合は、次のようにします。

public static String[] remove(String words[] , String a) {
    int counter = 0;
    for (int i = 0; i < words.length; i++) {
        if( a.equals(words[i]) ){
            words[i] = null;
            counter++;
        }
    }
    if(counter==0){
        return words;
    }
    String[] words2 = new String[words.length - counter];
    int i=0;
    for (String string : words) {
        if(string!=null){
            words2[i++]=string;
        }
    }   
    return words2;
}
于 2012-12-14T02:09:16.100 に答える
0

あなたに質問があります:

なぜああ、なぜ配列を使用しているのですか?List絶対に配列を使用する必要がない限り (これはまれです) 、常にコレクション (例: a ) を使用する必要があります。

の場合、Listこのメソッドは必要ありません。これをすべて実行Listするremove()メソッドがあるからです。

于 2012-12-14T01:36:50.593 に答える
0

私は次のようにします:

public void remove(String a) {
    List<String> tmp = new ArrayList<String>();

    for (String word : words) {
        if ((word != null) && (word.equals(a))) {
            continue;
        }

        tmp.add(word);
    }

    words = tmp.toArray(new String[]);
}
于 2012-12-14T01:31:41.103 に答える