首页 > 解决方案 > 一次替换哈希图中的所有相同值

问题描述

假设我有一个看起来像这样的 HashMap:

1 -> 一个

2 -> B

3 -> B

4 -> 一个

5 -> 一个

6 -> B

其中 1、2、3、4、5、6 是键,A、B、C 是值。

我想要做的是在一个步骤中用 HashMap 中的 A 的值替换 B 的所有值(无需遍历元素 2、3 和 6 并将 A 的值放入每个元素)。

基本上,我想删除对象 B 以及引用 B 的任何地方,用 A 替换它。我认为在 C/C++ 中,这可以使用指针来实现。我怎样才能在Java中做到这一点?

标签: javaobjectpointersreferencehashmap

解决方案


你不能,这不是哈希图的作用或它们的用途。

事实上,核心库中没有任何数据结构可以做到这一点。

一个简单的最佳途径是使用可变对象作为值。例如:

Map<Integer, StringBuilder> map = new HashMap<>();
StringBuilder a = new StringBuilder("A");
map.put(1, a);
map.put(2, a);
a.clear();
a.append("b");
System.out.println(map);

以上将最终打印“{1:b,2:b}”。当然,如果您创建 2 个单独的 stringbuilder 对象,每个对象都包含文本“a”,则更改一个不会更改另一个。

Guava有双向映射,它是双向的,但一般的想法是键和值都是唯一的,你显然在这里没有。Guava 也有 multimaps,将一个键映射为多个值;你也可以在这里使用这样的构造函数来处理一些东西:拥有一个由 aHashMap<K, V>和 a组成的数据结构Multimap<V, K>;hashmap 如上所述,multimap 执行相反的操作,并且在您的示例中映射B到值236,然后您可以使用它来稍微有效地编写一个方法来完成“替换所有等于 THIS 的值”的工作使用 THAT',通过在多映射中查找哪些键需要替换,然后替换映射中的那些 k/v 对,以及更新多映射。

请注意,这仍然是多个步骤,是 O(n),其中 n 是匹配键的数量,并且如果没有围绕您集合的大多数 API 的相当繁重的便捷 synchronized() 锁,就无法以多线程安全的方式完成。


推荐阅读