本文介绍了合并多个hashmaps的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
所以,我有两个hashMap
So, i have two hashMaps
public HashMap<String, Integer> map1 = new HashMap<String,Integer>();
public HashMap<String, Integer> map2 = new HashMap<String,Integer>();
我想创建一个hashmap,它由这两个hashmaps组合而成。
I want to create a hashmap, which consists of both of these hashmaps merged.
另外,当我添加一个元素到这两个hashmaps中的任何一个:
Also, when I add an element to either of these 2 hashmaps:
map1.put("key",1);
第三个hashmap应该有这个变化
The third hashmap should have this change
解决方案:
SOLUTION:
import java.util.*;
public final class JoinedMap {
static class JoinedMapView<K,V> implements Map<K,V> {
private final Map<? extends K,? extends V>[] items;
public JoinedMapView(final Map<? extends K,? extends V>[] items) {
this.items = items;
}
@Override
public int size() {
int ct = 0;
for (final Map<? extends K,? extends V> map : items) {
ct += map.size();
}
return ct;
}
@Override
public boolean isEmpty() {
for (final Map<? extends K,? extends V> map : items) {
if(map.isEmpty()) return true;
}
return false;
}
@Override
public boolean containsKey(Object key) {
for (final Map<? extends K,? extends V> map : items) {
if(map.containsKey(key)) return true;
}
return false;
}
@Override
public boolean containsValue(Object value) {
for (final Map<? extends K,? extends V> map : items) {
if(map.containsValue(value)) return true;
}
return false;
}
@Override
public V get(Object key) {
for (final Map<? extends K,? extends V> map : items) {
if(map.containsKey(key)){
return map.get(key);
}
}
return null;
}
@Override
public V put(K key, V value) {
throw new UnsupportedOperationException();
}
@Override
public V remove(Object key) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
for (final Map<? extends K,? extends V> map : items) {
map.clear();
}
}
@Override
public Set<K> keySet() {
Set<K> mrgSet = new HashSet<K>();
for (final Map<? extends K,? extends V> map : items) {
mrgSet.addAll(map.keySet());
}
return mrgSet;
}
@Override
public Collection<V> values() {
Collection<V> values = new ArrayList<>();
for (final Map<? extends K,? extends V> map : items) {
values.addAll(map.values());
}
return values;
}
@Override
public Set<Entry<K, V>> entrySet() {
throw new UnsupportedOperationException();
}
}
/**
* Returns a live aggregated map view of the maps passed in.
* None of the above methods is thread safe (nor would there be an easy way
* of making them).
*/
public static <K,V> Map<K,V> combine(
final Map<? extends K, ? extends V>... items) {
return new JoinedMapView<K,V>(items);
}
private JoinedMap() {
}
}
推荐答案
我认为这种方法是一个好的开始(当然你需要覆盖HashMap的删除和其他适当的方法):
I think this kind of approach is a good start (of course you would need to override HashMap's remove and other appropriate methods):
class MyMergeAwareHashMap<K,V> extends HashMap<K,V> {
HashMap<K, V> mergeMap
public MyMergeAwareHashMap(Map<K, V> mergeMap) {
this.mergeMap = mergeMap
}
@Override
public Object put(K key, V value) {
super.put(key, value)
mergeMap.put(key, value)
}
}
HashMap<String, Integer> mergedMap = new HashMap<String, Integer>()
MyMergeAwareHashMap<String, Integer> map1 = new MyMergeAwareHashMap<String, Integer>(mergedMap)
MyMergeAwareHashMap<String, Integer> map2 = new MyMergeAwareHashMap<String, Integer>(mergedMap)
map1.put('A', 1)
map2.put('B', 2)
println(map1.get('A')) // => 1
println(map1.get('B')) // => null
println(map2.get('A')) // => null
println(map2.get('B')) // => 2
println(mergedMap.get('A')) // => 1
println(mergedMap.get('B')) // => 2
这篇关于合并多个hashmaps的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!