0

重複の可能性:
Javaで文字列配列の要素を比較する方法は?

配列内の単語を文字列に設定して、重複を含まない単語の数を計算しようとしていますが、ifステートメントで重複をチェックしようとすると、「NullPointerException」と表示され、nullが含まれていることを意味します。配列。配列にnull値があるのはなぜですか?

文字列配列を設定するためのコードは次のとおりです。入力は「他の人に行うように、他の人に行う」です。

   String[] stringArray = new String[wordCount];
   while (!line.equals("DONE"))
   {
       for ( int k = 0 ; k < wordCount ; k++)
       {
           //put tokens into string array
           StringTokenizer tokens = new StringTokenizer(line);
           stringArray[k] = tokens.nextToken();
       }
   }

NullPointerExceptionを引き起こす比較およびifステートメントのコードは次のとおりです。

   for ( int j = 0 ; j < wordCount ; j++)
   {    
       for (int i = j+1 ; i < wordCount ; i++)
       {       
            if (stringArray[i] == null)
            {
                stringArray[i] = "null";
            } 
            else if (stringArray[i].compareTo(stringArray[j]) == 0 && i!=j) 
            {
                //duplicate
                System.out.print("\n" + stringArray[j]);
                duplicates++;
            }
       }
   }
   wordCount -= duplicates;
   System.out.print("\nNumber of words, not including duplicates: " + wordCount);

nullチェックを試みていますが、stringArray [i]を「null」に変更するとstringArray[j]も変更されるため、重複がさらに増えるため、結果はまだ大きく異なります。

助けてください!私は長い間これを解決しようとしてきました

4

3 に答える 3

4

equals()ではなく使用する必要がありますcompareTo()compareTo()nullNullPointerExceptionが渡された場合に発生します。

Comparableの Java ドキュメント

null はどのクラスのインスタンスでもないことに注意してください。e.equals(null) が false を返しても、e.compareTo(null) は NullPointerException をスローする必要があります。

          if (stringArray[i] == null) {
                continue;
            } else if (stringArray[i].equals(stringArray[j]) && i != j) {
                // duplicate
                duplicates++;
            }

したがって、完全なソース コードは次のようになります。I have not changed any logic inside your for loop.

    String line = "DO UNTO OTHERS AS YOU WOULD HAVE THEM DO UNTO YOU";
    String[] stringArray = line.split("\\s");//Use split StringTokenizer use is discouraged in new code
    int duplicates = 0;
    int wordCount = stringArray.length;
    for (int j = 0; j < stringArray.length; j++) {
        for (int i = j + 1; i < stringArray.length; i++) {
            if (stringArray[i] == null) {
                stringArray[i] = "null";
            } else if (stringArray[i].equals(stringArray[j]) && i != j) {
                // duplicate
                System.out.print("\n" + stringArray[j]);
                duplicates++;
            }
        }
    }
    wordCount -= duplicates;
    System.out.print("\nNumber of words, not including duplicates: "
            + wordCount);
于 2012-10-18T05:21:29.267 に答える
1

if (stringArray[i] == null)null チェックをドロップします。それは必要はありません。代わりに、配列を初期化した直後に配列を印刷してみて、wordCount大きすぎるかどうか、またはトークナイザーが必要な場所で文字列を分割していないかどうかを確認してください。

于 2012-10-18T05:23:01.257 に答える
0

@AmitDによるコードは素晴らしいです!! あなたのコードであなたが抱えていると思う唯一の問題は ワードカウントに関するものです..文字列配列を初期化していないため、例外が発生する可能性があると思います..何かを得るかどうか..それが役立つかもしれません...

于 2012-10-18T06:10:42.247 に答える