2

これはスペルチェッカーのメソッドです。ヘッダーが説明しているように、arraylist に追加されたすべての単語が親配列の words にある場合にのみ、true を返す必要があります。それ以外の場合は、false 値を返す必要があります。私はこれと数時間戦っていますが、これが私の現在の状況です...

    /**
    * This method returns true if (and only if) all words in the
    * given wordList are found in the dictionary.
    */
    public boolean allKnown(ArrayList<String> wordList)
    {
        boolean result = true;
        for(int index = 0; index < wordList.size(); index++)
        {
            if(words.contains(!wordList.contains(index)))
            {
                result = false;
            }
        result = true;
        }
    return result;
    }

私が本当に必要としているのは、はいまたはいいえで答えられる方法だけですが、迷っています。これはそのコードを教える演習であるため、与えられたコードを試してみてください。ありがとう!

4

7 に答える 7

2

あなたの問題はここにあります:

if(words.contains(!wordList.contains(index)))

!wordList.contains(index)はブール式であるため、常に または のいずれかに評価されtrueますfalse。したがって、実際には、wordsリストに含まれているのが true または false であり、必要な単語ではないかどうかを確認しています。に置き換えてif(!words.contains(wordList.get(index))、現在の単語が辞書にあるかどうかを確認します。

次の解決策をお勧めします。単語ごとに繰り返しwordList、単語ごとに辞書にあるかどうかを確認します。そうでない場合は、すぐに false を返します。ループの最後に到達したら、true を返します。

于 2013-10-24T07:49:16.123 に答える
2

ここに別の解決策があります:

public static boolean allKnown(List<String> parent, List<String> child) {
    List<String> temp = new ArrayList<String>(child);
    temp.removeAll(parent);
    return temp.isEmpty();
}

例えば:

List<String> parent = Arrays.asList("w1", "w2", "w3", "w4");
List<String> childOk = Arrays.asList("w1", "w4");
List<String> childKo = Arrays.asList("w1", "xx");
System.out.println(allKnown(parent, childOk));
System.out.println(allKnown(parent, childKo));

版画:

true
false
于 2013-10-24T08:00:55.087 に答える
1

取り出す-ループのすべてのステップでresult = true;値をリセットしたくありません。true

またwordList.containswordList.get(特定のインデックスで単語を取得したいため、単語が に含まれているかどうかを確認しないためwordList)に変更し、外側に移動し!ます(文字列を「not」にできないため)。

また、 for ループ条件で の値をチェックするresult(または単に if ステートメントで直接戻る) ことによって最適化することもできます。

public boolean allKnown(ArrayList<String> wordList)
{
    boolean result = true;
    for(int index = 0; index < wordList.size() && result; index++)
    {
        if(!words.contains(wordList.get(index)))
        {
            result = false;
        }
    }
    return result;
}

words本当に が配列でではない場合ArrayListcontainsメソッドはありません。二重の for ループを使用するか、リストに変換する必要があります。

  List<String> parentWords = Arrays.asList(words);
  ...
  if (parentWords.contains(...))
于 2013-10-24T07:47:07.173 に答える
0

if の後に結果を true にリセットしないでください。このように、関数全体が常に true を返すためです。

于 2013-10-24T07:47:22.040 に答える
0

いくつかのヒント:

  1. メソッドのパラメーターとして使用しないでArrayListください。常により抽象的なListものを使用してください (コードは に依存しArrayListないため、必要に応じて後で実装を変更できます)。
  2. List以下に示す簡略化された構文を使用して、オブジェクトを反復処理します。
  3. wordsを返すには、リストにない単語が 1 つだけ必要なfalseので、正確にそれを行います (以下に示すように)。

public boolean allKnown(List<String> wordList) {
    for (String word : wordList) {
        if (!words.contains(word)) {
            return false;
        }
    }
    return true;
}
于 2013-10-24T07:53:46.927 に答える
0

これはより単純なバージョンです:

public boolean allKnown(List<String> wordList) {
   List<String> wordListCopy = new ArrayList<String>(wordList);
   return !wordListCopy.retainAll(words);
}

PS: あなたに含まれていないすべての要素をretainAll()あなたから取り除きます。このメソッドは、(存在しない要素を削除した後に) 呼び出しの結果として変更された場合にtrueを返します。つまり、すべての要素が you に存在する場合、このメソッドは false を返します。wordListdictionnarywordListwordListdictionnary

于 2013-10-24T08:20:03.853 に答える