3

プログラムで HashTable を作成する際に問題が発生しています。WordLadder ゲームを作成しています。基本的に、HashTableに一意の単語であるキーを含め、値が1文字の違いである単語になるようにします。問題は、何を入れているかを確認するために印刷すると、必要なものが完全に印刷されますが、HashTableを返すとナンセンスが返されることです。

HashTable を生成するための私のコードは次のとおりです。

public Hashtable<String, ArrayList<String>> findNeighbors(){
      Hashtable<String, ArrayList<String>> data = new Hashtable<String, ArrayList<String>>();
      ArrayList<String> neighb = new ArrayList<String>();
      for(int i=0; i < 5; i++){
       for(int j=0; j < 5; j++){
        if (isNeighbor(words.get(i), words.get(j))) {
         neighb.add(words.get(j));
        }
       }
       data.put(words.get(i), neighb);
       //System.out.println(words.get(i)+ " "+data.get(words.get(i))); <This Works perfectly fine
       System.out.println(data.toString()); //<This returns nonsense
       neighb.clear();
      }

      return data;
     }

public boolean isNeighbor(String a, String b){
      int diff = 0;
      for (int i = 0; i < a.length(); i++){
       if(a.charAt(i) != b.charAt(i)){
        diff++;
       }
      }
      return diff==1;
     }
4

2 に答える 2

2

HashTable同じ参照を使用して、すべてのキーを内部に配置することはできません。呼び出すたびclear()に、追加したリストがクリアされます。これはすべてのキーで同じです。So create ArrayList for each key

  for(int i=0; i < 5; i++){
  ArrayList<String> neighb = new ArrayList<String>();<-- Move inside loop
   for(int j=0; j < 5; j++){
    if (isNeighbor(words.get(i), words.get(j))) {
     neighb.add(words.get(j));
    }
   }
   data.put(words.get(i), neighb);
   //System.out.println(words.get(i)+ " "+data.get(words.get(i))); <This Works perfectly fine
   System.out.println(data.toString()); //<This returns nonsense

  }
于 2012-10-23T20:42:24.097 に答える
1

見てくださいneighb.clear();、あなたはあなたがあなたのハッシュテーブルに入れたのと同じオブジェクトを呼び出しています。リストをハッシュテーブルに入れてすぐにクリアします。新しいローカル配列リストを作成し、すべての要素を新しい配列リストに追加し、ハッシュテーブルに新しい配列リストを追加してから、egをクリアしますneighb

      List<String> newList = new ArrayList<String>();
      newList.addAll(neighb);
      data.put(words.get(i), newList);
      newList.clear();
于 2012-10-23T20:41:22.647 に答える