2

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

 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               
4

6 回答 6

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。然后输入所有德语单词,如果有重复键则连接。您可能需要某种分隔符,例如/介于两者之间的分隔符,以便稍后提取两者。

于 2012-06-13T15:02:23.423 回答
2

Java 主库本身没有类似的东西,你必须使用第三方提供的东西,比如 Google Guava 的Multimap,它完全符合你的要求,或者手动构建类似的东西。

您可以在项目的网站上下载 Guava 库。使用多重映射与使用映射相同,如下所示:

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两者都有germanenglish它们将被打印两次。

于 2012-06-13T15:01:55.093 回答
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));
于 2012-06-13T15:06:55.267 回答
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());
    }
}
于 2012-06-13T15:08:42.067 回答
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}
于 2012-06-13T15:12:50.477 回答
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 个值。

于 2012-06-13T15:41:55.043 回答