【问题标题】:How do I enumerate the keys and values of a Hashtable?如何枚举 Hashtable 的键和值?
【发布时间】:2011-01-14 01:13:14
【问题描述】:

我有问题;我有一些数据,我用Hashtable 显示它 例如我写:

 Enumeration keys;
    keys=CellTraffic_v.elements();
    while(keys.hasMoreElements())
      outputBuffer.append(keys.nextElement()+"\n\n");

但它只显示值我如何将值和键一起显示? 比如这个

如果我的钥匙是“A” 我的价值是“B”告诉我这个:

A  B

谢谢...

【问题讨论】:

  • 一个更好的标题可能是:如何枚举 Hashtable 的键和值
  • @Lachlan:确实如此。 @OP:冒昧改变它。

标签: java hashtable


【解决方案1】:

Hashtable 实现MapMap.entrySet 函数返回 Map.Entry 实例的集合 (Set),这些实例具有 getKeygetValue 方法。

所以:

Iterator<Map.Entry>  it;
Map.Entry            entry;

it = yourTable.entrySet().iterator();
while (it.hasNext()) {
    entry = it.next();
    System.out.println(
        entry.getKey().toString() + " " +
        entry.getValue().toString());
}

如果您知道 Hashtable 中条目的类型,则可以使用模板来消除上面的 toString 调用。例如,如果您的 Hashtable 声明为 Hashtable&lt;String,String&gt;,则 entry 可以声明为 Map.Entry&lt;String,String&gt;

如果您可以将模板与泛型结合起来,那就太简单了:

for (Map.Entry<String,String> entry : yourTable.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

假设yourTableHashtable&lt;String,String&gt;。只是展示了 Java 在过去几年中取得了多大的进步,而且基本上没有失去其基本的 Java 特性。

略OT:如果您不需要同步,请使用HashMap 而不是Hashtable。如果您这样做,请使用ConcurrentHashMap(谢谢,akaappa!)。

【讨论】:

【解决方案2】:

entrySet() 返回哈希表中值的枚举。
keySet() 返回哈希表中键的枚举。
entrySet() 以 Set 形式返回条目(键和值)

for( Iterator iter=hash.keySet().iterator(); iter.hasNext(); ) {
    String key = (String) iter.next();
    String value = (String) hash.get( key );
}


for( Iteration iter=hash.entrySet().iterator(); iter.hasNext(); ) {
    Map.Entry entry = (Map.Entry) iter.next();
    String key = (String) entry.getKey();
    String value = (String) entry.getValue();
}

或使用泛型,在这种情况下,您的哈希是 HashMap

for( String key : hash.keySet() ) {
    String value = hash.get( key );
}

for( Map.Entry entry : hash.entrySet() ) {
    String key = entry.getKey();
    String value = entry.getValue();
}

【讨论】:

  • 我知道,但我想一起展示它们,例如 System.out.println(key + value);
【解决方案3】:

你有钥匙吗?使用键从映射中获取值,并且您拥有所有映射。例如在 Java 中使用 String 作为键的类型:

for (String key : map.keySet()) {
    System.out.println(key + ":" + map.get(key));
}

.

【讨论】:

  • 这是昂贵的。 Crowder 的解决方案要好得多。
  • @akappa:这种方法究竟以何种方式成本更高?两种解决方案都会迭代键值对的集合。
  • 在您的解决方案中,您对每次迭代进行查找,而在 entrySet 解决方案中您根本不进行查找。
  • 您知道 entrySet() 方法的实现不会对每个键值对进行查找吗?据我所知,这两种方法都有 O(n) 复杂度。
  • 如果map是HashMap,很可能两个解都是O(n),但是如果map是TreeMap,这个解是O(n log(n)),而entry set version可能仍然只是 O(n)。
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2022-08-03
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多