连接两个哈希映射而不从两个映射中删除公共条目

时间:2012-06-13 14:59:01

标签: java hashmap

我有两个哈希图,特别是两种语言的词汇表示英语和德语。我想连接这些地图以返回单个地图。我试过:

 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               

6 个答案:

答案 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->megerman都有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个值。