2017-10-31 8 views
-1

申し訳ありませんが、これは間違った質問です。ハッシュマップ:文字列リストに文字列を追加しようとしています

(私は完全に私が行うことになっていたものを誤解しているため、オリジナルのポストのほとんどを削除しました。)

static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) { 
    List<String> maurice = new ArrayList<String>(); 
    List <String> wallace = new ArrayList<String>(); 
    List <String> romeo = new ArrayList<String>(); 
    for (int i=0; i<=text.size()-3; i++) { 
     maurice.clear(); 
     wallace.clear(); 
     maurice.add(text.get(i)); 
     maurice.add(text.get(i+1)); 
     if (whatComesNext.containsKey(maurice)==false) 
     whatComesNext.put(maurice, romeo); 
     wallace=whatComesNext.get(maurice); 
     wallace.add(text.get(i+3)); 
     whatComesNext.put(maurice, wallace); 
    } 
    } 

すべてのキーは、2つの連続した言葉であり、私は、文字列のリストのキーと文字列のリスト値のマップを持っていますStringリスト "text"キー "text.subList(i、i + 2)"を見つけるたびに、text.get(i + 2)をキーの値に追加する必要があります。

たとえば、

テキストの要素は[A、B、C、D、A、B、E、F]です。

  1. キー(A、B)の値は(C)です。
  2. キー(B、C)の値は(D)です。
  3. キー(C、D)の値は(E)です。
  4. キー(D、A)の値は(B)です。
  5. キー(A、B)の値は(C、E)です。
  6. キー(B、E)の値は(F)です。

コードの問題は何とかそれがwhatComesNextを構築しなければならないテキストのサイズについては、ArrayIndexOutOfBoundsExceptionを返すということです。

+1

ここでは何が間違っているのかを指定せずにコードを投稿しているので、私はこの質問をd​​ownvotedしました。コードが期待すること、期待する理由、実際にやっていること、そしてそれが間違っている理由を期待しています。この情報を含めるためにあなたの質問を編集してください、そして私は私のdownvoteを引っ込めることを検討します。参照してください:[最小、完全、および検証可能な例を作成する方法](http://stackoverflow.com/help/mcve/) –

+0

コードの問題は、何らかの形で、テキストサイズのArrayIndexOutOfBoundsExceptionを返すことですwhatComesNextを作成しています。 – user2709168

+0

私はここに更新して依頼できますか?私は添付のスレッドを読んで、コードに小さなエラーを実現しました。私はOutOfBoundsExceptionを排除しました。問題は、コードがすべての値をnullに設定することです。 – user2709168

答えて

1

clearは、Listを再作成するために使用されないという問題があります。代わりに、あなたのコードではの同じインスタンスをMapのすべての要素に使用しています。その後、clearを実行すると、マップ内のすべての要素がクリアされます。

コードの最小限の変更は、次のとおりです。

static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) { 
    List<String> maurice; 
    List <String> wallace; 
    for (int i=0; i<=text.size()-3; i++) { 
     maurice = new ArrayList<>(); 
     maurice.add(text.get(i)); 
     maurice.add(text.get(i+1)); 
     if (whatComesNext.containsKey(maurice)==false) 
     whatComesNext.put(maurice, new ArrayList<>()); 
     wallace=whatComesNext.get(maurice); 
     wallace.add(text.get(i+2)); 
     whatComesNext.put(maurice, wallace); 
    } 
} 
+0

だから、あなたは、新しいArrayList としてmauriceを初期化することによって、すべてのキーが動的にそれを参照するので、それをクリアすると私のキーもクリアされると言っていますか?しかし、モーリスを明示的に初期化しないと、それをクリアするたびに新しいリストが作成されます。 – user2709168

+0

あなたは正しい、キーと値は異なるインスタンスである必要があります。私はそれを見落とし、 'maurice'は' containsKey'を呼び出すためだけに使用されると考えました。私は 'mauirce'を各ループの新しいインスタンスにするために編集しました。 – Alex

関連する問題