2

私は2つのハッシュマップを持っています。特に、英語とドイツ語の2つの言語の語彙があります.これらのマップを両方とも連結して、単一のマップを返したいと思います.私は試しました:

 hashmap.putall()

ただし、両方のマップで共通のエントリの一部を削除し、単一のエントリのみに置き換えます。ただし、両方の語彙をそのままにして、それらを連結したいだけです。それを行う方法はありますか?他に方法がない場合。ハッシュマップのメソッドを好むでしょう。

[編集]

より明確にするために、2つのマップを見てみましょう

      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ます。次に、重複するキーがある場合は連結して、すべてのドイツ語の単語を入力します。/後で2つを抽出できるように、間にあるようなある種の区切り文字が必要になる場合があります。

于 2012-06-13T15:02:23.423 に答える
2

Javaメインライブラリ自体にはそのようなものはありません。GoogleGuavaのMultimapのようなサードパーティが提供するものを使用する必要があります。それはあなたが望むことを正確に実行するか、このようなものを手動で構築します。

GuavaライブラリはプロジェクトのWebサイトからダウンロードできます。マルチマップを使用することは、次のようにマップを使用することと同じです。

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回印刷される場合。

于 2012-06-13T15:01:55.093 に答える
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の答えに似ています

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

ここで@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 に答える