这是一个难题:
"kb“是一个扩展java.util.Hashtable的类的实例,键是一个字符串,存储的值是一个名为"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我们可以看到“k”的转储,它应该是一组键。但是很明显,它只选择了Hashtable中的最后一个“触摸”条目。(在这次测试中,"triguy“是最后一次增值。)
是否需要以某种方式重置Hashtable选择器?这是没有意义的,因为代码按键选择每个值。是否需要重置键集(K)上的选择器?这也没有意义,因为循环应该简单地迭代整个集合。
我不知道,我错过了什么?
-v
发布于 2013-09-09 06:14:31
可能您有一个与多个键相关联的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);
}发布于 2013-09-09 06:19:05
显然,您使用不同的键添加了4个类似的(相同的字段toString() ) IntelCards。Hashtable有唯一的键,而不一定是唯一的值。
https://stackoverflow.com/questions/18692354
复制相似问题