如何解决一次替换哈希图中的所有相同值
比方说,我有一个看起来像这样的HashMap:
1-> A
2-> B
3-> B
4-> A
5-> A
6-> B
其中1、2、3、4、5、6是键,而A,B,C是值。
我想做的是在一个步骤中将B的所有值替换为HashMap中的A的值(而不必遍历元素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具有双向的双向映射,但是一般的想法是键和值都是唯一的,并且您显然在这里没有。番石榴还具有多图,可将一个键映射到多个值。您也可以使用此类构造函数在此处进行一些操作:具有既包含HashMap<K,V>
也包含Multimap<V,K>
的数据结构;哈希图如上,多图执行相反的操作,在您的示例中,将B
映射到值2
,3
和6
,然后您就可以用来高效地编写一种方法,该方法通过查找多图中需要替换的键,然后替换映射中的那些k / v对,来完成“用THAT替换所有等于THIS的值”的工作。以及更新多图。
请注意,这仍然是多个步骤,是O(n),其中n是匹配键的数目,并且如果没有非常方便的synced()锁定您的大多数API,就无法以多线程安全的方式完成集合。
,为什么不只维护第二个Map并设置String以便您可以维护2-> B,3-> B,6-> B和B-> [2,3,6]。
Map<String,Set<Integer>> letterToKeys = new HashMap<>();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。