使用ArrayList作为值来填充HashTable

3
我正在创建一个单词阶梯游戏,但是在程序中创建HashTable时遇到了问题。我希望我的HashTable包含唯一单词作为键,并且值将是只相差一个字母的单词。问题在于,当我打印出来检查我放入HashTable中的内容时,它完全符合我的要求,但是当我返回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;
     }
2个回答

2

您不能使用同一引用将所有键放入HashTable中。每次调用clear()时,它都会清除您添加的列表,这对于所有键都是相同的。因此,为每个键创建一个ArrayList

  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

  }

1
看一下 neighb.clear();,你正在调用你放入Hashtable中的同一个对象。你在把它放入Hashtable后很快就清空了列表。也许你想创建一个新的本地ArrayList,将所有元素添加到新的ArrayList中,然后将新的ArrayList添加到Hashtable中,然后清除你的neighb,例如。
      List<String> newList = new ArrayList<String>();
      newList.addAll(neighb);
      data.put(words.get(i), newList);
      newList.clear();

谢谢,这正是我想要的! - Shepard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接