迭代Java中的Hashtable(谜题)

时间:2013-09-09 06:08:33

标签: java hashtable

所以这就是难题:

“kb”是扩展java.util.Hashtable的类的实例 键是一个String,存储的值是一个名为“IntelCard”的类

此代码提取密钥,并努力打印表格中的数据

    Set<String> ks = kb.keySet();
    System.out.println(ks); // is this what we thought?
    for(String key: ks){
        IntelCard ic = kb.get(key);
        String o = String.format("%-24s %24s %8s", 
                          ic.name, ic.alliance, ic.might);
        System.out.println(o);
    }

这是输出:

[commanderv, repo, olaf, triguy]
triguy                                  galactica    10000
triguy                                  galactica    10000
triguy                                  galactica    10000
triguy                                  galactica    10000

我们可以看到应该是一组键的“ks”的转储。但显然它只选择Hashtable中最后一个“触及”的条目。 (在此测试中,“triguy”是最后添加的值。)

是否需要以某种方式重置Hashtable选择器?它没有意义,因为代码按键选择每个值。是否需要重置按键组(ks)上的选择器?这没有任何意义,因为循环应该简单地迭代整个集合。

我不知道,我错过了什么?

--- v

2 个答案:

答案 0 :(得分:1)

可能你有与多个键相关联的IntelCard对象;要确保您正在迭代所有键,请使用String.format(key, ic.alliance, ic.might)格式化字符串 使用Map.Entry<K,V>而不是使用keySet()/get()对迭代地图:

for(final Map.Entry<String,IntelCard> e : kb.entrySet()) {
  IntelCard ic = e.getValue();
  String o = String.format("%-24s %24s %8s", ic.name, ic.alliance, ic.might);
  System.out.println(o);
}

答案 1 :(得分:1)

显然你添加了4个类似的(相同的toString()字段)具有不同键的IntelCards。 Hashtable具有唯一键,不一定是唯一值。