【问题标题】:Iterating over and deleting from Hashtable in JavaJava中的Hashtable迭代和删除
【发布时间】:2011-01-22 00:29:56
【问题描述】:

我在 Java 中有一个 Hashtable,想要遍历表中的所有值并在迭代时删除特定的键值对。

如何做到这一点?

【问题讨论】:

标签: java iterator hashtable


【解决方案1】:

您需要使用显式 java.util.Iterator 来迭代 Map 的条目集,而不是能够使用 Java 6 中提供的增强型 For 循环语法。以下示例迭代 MapIntegerString 对,删除任何 Integer 键为 null 或等于 0 的条目。

Map<Integer, String> map = ...

Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();

while (it.hasNext()) {
  Map.Entry<Integer, String> entry = it.next();

  // Remove entry if key is null or equals 0.
  if (entry.getKey() == null || entry.getKey() == 0) {
    it.remove();
  }
}

【讨论】:

  • Hashtable 中不能有 null 键。这就是它与Map 的不同之处。此外,您在上述代码中查询的是Map.Entry getValue,而不是getKey。你不能做entry.getValue() == 0,因为值的类型是String
  • @polygenelubricants,Map 是一个对 null 没有任何限制的接口。 HashMap 是一个不允许空值的 Map 实现。
  • 我没有在我的代码中引用 Hashtable,也不会使用它,因为它已被 HashMap 取代(确实允许空键和值)。
  • BTW 2 否决票?!似乎有些人被困在使用 JDK 1.1 集合,或者只是懒得阅读 Map 的 API 定义。
  • 我提到Hashtable,因为这就是 OP 所拥有的。而@Steve,HashMap 确实允许空值 (java.sun.com/javase/6/docs/api/java/util/HashMap.html)。
【解决方案2】:

您可以使用临时删除列表:

List<String> keyList = new ArrayList<String>;

for(Map.Entry<String,String> entry : hashTable){
  if(entry.getValue().equals("delete")) // replace with your own check
    keyList.add(entry.getKey());
}

for(String key : keyList){
  hashTable.remove(key);
}

您可以在Java API 中找到有关 Hashtable 方法的更多信息

【讨论】:

  • 您可以这样做,但不需要使用额外的集合;它只会让事情变得更复杂。
【解决方案3】:

所以您知道要提前删除的键值对吗?这样做就更清楚了,那么:

 table.delete(key);
 for (K key: table.keySet()) {
    // do whatever you need to do with the rest of the keys
 }

【讨论】:

  • 我只知道值所以这行不通。感谢您的关注
【解决方案4】:

你可以使用Enumeration:

Hashtable<Integer, String> table = ...

Enumeration<Integer> enumKey = table.keys();
while(enumKey.hasMoreElements()) {
    Integer key = enumKey.nextElement();
    String val = table.get(key);
    if(key==0 && val.equals("0"))
        table.remove(key);
}

【讨论】:

  • 我们也可以对 HashMap 使用枚举吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-06
  • 2021-07-12
  • 2012-11-30
  • 2021-03-30
  • 2016-07-19
  • 2019-01-30
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多