我有两个哈希图,特别是两种语言的词汇表示英语和德语。我想连接这些地图以返回单个地图。我试过:
hashmap.putall()
但是,删除了两个地图中常见的一些条目,并仅用单个条目替换它。但是我想保持两个词汇完整只是连接它们。有没有办法做到这一点?如果不是其他任何方式。我更喜欢hashmap中的任何方法。
[编辑]
为了更清楚,让我们看两张地图
at the 500 um die 500
0 1 2 0 1 2
重新进入
at the 500 um die 500
0 1 2 3 4 5
答案 0 :(得分:5)
然后你必须编写自己的自定义“putAll()”方法。像这样的东西会起作用:
HashMap<String> both = new HashMap<String>(english);
for(String key : german.keySet()) {
if(english.containsKey(key)) {
both.put(key, english.get(key)+german.get(key));
}
}
首先复制英文HashMap
。然后输入所有德语单词,如果有重复键则连接。您可能需要某种分隔符,例如/
之间的分隔符,以便稍后可以提取这两个分隔符。
答案 1 :(得分:2)
Java主库本身并没有这样的东西,你必须使用第三方提供的东西,比如Google Guava的Multimap,它完全符合你的需要,或者手动构建这样的东西。
您可以下载Guava库at the project's website。使用多图与使用地图相同,如:
Multimap<String,String> both = new ArrayListMultimap <String,String>();
both.putAll( german );
both.putAll( english);
for ( Entry<String,String> entry : both.entrySet() ) {
System.out.printf( "%s -> %s%n", entry.getKey(), entry.getValue() );
}
此代码将打印所有key-value
对,包括两个地图上都存在的对。因此,如果me->me
和german
都有english
,则会打印两次。
答案 2 :(得分:1)
与@ tskuzzy的回答类似
Map<String, String> both = new HashMap<String, String>();
both.putAll(german);
both.putAll(english);
for (String e : english.keySet())
if (german.containsKey(e))
both.put(e, english.get(e) + german.get(e));
答案 3 :(得分:1)
您不能直接使用任何Map
实现,因为在地图中,每个键都是唯一的。
可能的解决方法是使用Map<Key, List<Value>>
,然后手动连接地图。使用List作为连接映射的优点是,可以轻松地检索每个单独的值而无需任何额外的摆弄。
这样的事情会起作用:
public Map<Key, List<Value>> concat(Map<Key, Value> first, Map<Key, Value> second){
Map<Key, List<Value>> concat = new HashMap<Key, List<Value>>();
putMulti(first, concat);
putMulti(second, concat);
return concat;
}
private void putMulti(Map<Key, Value> content, Map<Key, List<Value>> dest){
for(Map.Entry<Key, Value> entry : content){
List<Value> vals = dest.get(entry.getKey());
if(vals == null){
vals = new ArrayList<Value>();
dest.put(entry.getKey(), vals);
}
vals.add(entry.getValue());
}
}
答案 4 :(得分:1)
@tskuzzy和@Peter在这里的答案略显即兴。只需通过扩展StrangeHashMap
定义您自己的HashMap
。
public class StrangeHashMap extends HashMap<String, String> {
@Override
public String put(String key, String value) {
if(this.containsKey(key)) {
return super.put(key, super.get(key) + value);
} else {
return super.put(key, value);
}
}
}
你可以这样使用它:
Map<String, String> map1 = new HashMap<String, String>();
map1.put("key1", "Value1");
map1.put("key2", "Value2");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("key1", "Value2");
map2.put("key3", "Value3");
Map<String, String> all = new StrangeHashMap();
all.putAll(map1);
all.putAll(map2);
System.out.println(all);
以上为我打印以下内容:
{key3=Value3, key2=Value2, key1=Value1Value2}
答案 5 :(得分:1)
鉴于问题中的新元素,您实际需要使用的是列表。在这种情况下,你可以这样做:
List<String> english = ...;
List<String> german = ...;
List<String> concat = new ArrayList<String>(english.size() + german.size());
concat.addAll(english);
concat.addAll(german);
你就是。您仍然可以使用concat.get(n)
来检索连接列表中的第n个值。