java - 一次替换哈希图中的所有相同值
问题描述
假设我有一个看起来像这样的 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}”。当然,如果您创建 2 个单独的 stringbuilder 对象,每个对象都包含文本“a”,则更改一个不会更改另一个。
Guava有双向映射,它是双向的,但一般的想法是键和值都是唯一的,你显然在这里没有。Guava 也有 multimaps,将一个键映射为多个值;你也可以在这里使用这样的构造函数来处理一些东西:拥有一个由 aHashMap<K, V>
和 a组成的数据结构Multimap<V, K>
;hashmap 如上所述,multimap 执行相反的操作,并且在您的示例中映射B
到值2
、3
和6
,然后您可以使用它来稍微有效地编写一个方法来完成“替换所有等于 THIS 的值”的工作使用 THAT',通过在多映射中查找哪些键需要替换,然后替换映射中的那些 k/v 对,以及更新多映射。
请注意,这仍然是多个步骤,是 O(n),其中 n 是匹配键的数量,并且如果没有围绕您集合的大多数 API 的相当繁重的便捷 synchronized() 锁,就无法以多线程安全的方式完成。
推荐阅读
- javascript - 为什么useRef解决了stale state的问题?
- r - 以列名作为标题绘制数据框的列
- python - 在python中求解表的微分方程
- api - API端点不同国家
- android - Gradle 将sources.jar 和aar 上传到jfrog 工件。artifactoryPublish 会生成两个 pom-default.xml,它会随机推送其中一个
- azure - Azure 应用服务中的 .NET5 Blazor 服务器应用返回“您无权查看此目录或页面”
- http-status-code-404 - 谷歌搜索控制台错误索引一个从未创建的页面
- asp.net-mvc - 您如何创建特定于您使用数据库创建的对象的视图?
- django - Chartjs不会使用views.py从Django中的mysql数据库请求的datetime.datetime代码呈现图形
- netlogo - 寻找最近的代理