一次替换哈希映射中所有相同的值



假设我有一个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实现它?

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

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

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

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}";。当然,如果您创建两个单独的字符串生成器对象,每个对象都包含文本"a",则更改其中一个不会更改另一个。

Guava有双向映射,但总的来说,键和值都是唯一的,显然这里没有。Guava还有多映射,可以将一个键映射为多个值;你也可以在这里使用这样的构造函数:有一个由HashMap<K, V>Multimap<V, K>组成的数据结构;hashmap如上所述,multimap执行相反的操作,并且在您的示例中,将B映射到值236,然后您可以使用这些值来高效地编写一个方法,通过查找multimap中需要替换的键,然后替换map中的那些k/v对,以及更新多映射。

请注意,这仍然是多个步骤,是O(n(,其中n是匹配键的#,如果没有在集合的大部分API周围使用大量方便的synchronized((锁,就无法以多线程安全的方式完成。

为什么不维护第二个带String to Set的Map,这样就可以维护2->B、 3->B、 6->B和B->[2,3,6]。

Map<String, Set<Integer>> letterToKeys = new HashMap<>();

最新更新