【问题标题】:How do I remove an element from a hashtable using its value and not the key?如何使用其值而不是键从哈希表中删除元素?
【发布时间】:2014-03-27 06:22:42
【问题描述】:

我是哈希表的新手,我只是在弄清楚它的基本操作。 我创建了一个如下所示的哈希表并插入了值。

Hashtable<Integer , String> ht = new Hashtable<Integer , String>();
ht.put(1234, "ABCD");
ht.put(2345, "EFGH");
ht.put(4567, "IJKL");

我可以使用如下所示的键删除所需的元素

System.out.println("Deleting entry with key 2345");
ht.remove(2345);
System.out.println(ht.toString());

给出以下输出

Deleting entry with key 2345
{4567=IJKL, 1234=ABCD}

我找不到任何有助于使用该值作为索引在哈希表中定位元素并删除该元素的方法。我该怎么办?

【问题讨论】:

  • 你关心这个操作的效率吗?如果这样做,则需要不同的数据结构。
  • 呃,你知道一个值可以在地图中出现多次,对吧?
  • @NPE 如何改进它?
  • @fge 是的。我明白这一点。但就像我说的,我是使用哈希表的新手。现在只需使用简单的操作即可弄清楚它的正面和反面。
  • 嗯,Map 的目的是通过键而不是值来访问条目。一些库(例如 Guava)确实有双向映射,但删除给定值的键不是 Map 的“简单操作”;)

标签: java hashtable


【解决方案1】:

试试这个

ht.values().remove("ABCD");

这将删除一个具有指定值的条目,如果可能有多个具有相同值的条目你可以使用这个

ht.values().removeAll(Collections.singleton("ABCD"));

【讨论】:

  • 非常感谢。这正是我想要的!
【解决方案2】:
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 value equals xxx.
  if (entry.getValue() != null && entry.getValue().equals("X")) {
    // Do something
  }
}

【讨论】:

    【解决方案3】:

    使用Map.entrySet() 导航并检查Map.Entry#getValue() 是否相等。
    您可以多次使用一个值,因此使用 Iterator 迭代 entrySet 并使用 Iterator.remove() 删除元素

    void deleteItem(String item) {
      Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
      while (it.hasNext()) {
        Map.Entry<Integer, String> entry = it.next();
        if(entry.getValue().equals(item)) {
          it.remove();
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多