2

各キーがmap1に一意の値を持つ場合にのみ、キーと値のペアをmap1からmap2に転送する方法に固執しています。

次のマップがあるとします。

  • map1: [1,2] [2,4] [4,4]
  • map2: [1,2] [2,4]

アルゴリズムは次のようになると思います。

  1. 最初のマップのエントリをループします。
  2. map2 にキーを追加します。
  3. map2 の値に対してチェックするセットに値を追加します
  4. 値が重複している場合、値はセットに追加されず、対応するキーを map2 に追加することは無視されます。

コードスニペット:

public static <K,V> Map<K,V> unique (Map<K,V> m) {
  Map<K,V> newMap = new ArrayMap<K,V>();

  //Remember all values in the newMap.
  Set<V> holding = new ArraySet<V>(newMap.values());

  for (Map.Entry<K, V> graphEntry : m.entries()) {
     //not sure.
  }

  return newMap;  
}

正しい軌道に乗せる方法についての私の考えはありますか?ここでかなり迷った。

4

3 に答える 3

4

キーがマップにない場合にのみアイテムを追加するMap<K, V>作成から。Map<V, K>これを使用してMap<V, K>、を再作成しますMap<K, V>

public static <K, V> Map<K, V> createMap(Map<K, V> m) {
    Map<K, V> map = new HashMap<K, V>();
    Map<V, K> tmpMap = new HashMap<V, K>();
    for(Map.Entry<K, V> entry : m.entrySet()) {
        if (!tmpMap.containsKey(entry.getValue())) {
            tmpMap.put(entry.getValue(), entry.getKey());
        }
    }
    for(Map.Entry<V, K> entry : tmpMap.entrySet()) {
        map.put(entry.getValue(), entry.getKey());
    }
    return map;
}

データの保存順序を維持する必要がある場合は、のLinkedHashMap代わりにを使用してHashMapください。

于 2012-10-06T16:33:14.843 に答える
0

Guava BiMapをチェックしてください..これはあなたが必要とするものです..

問題は解決しましたが、以下のコードを見て、Guavaやりたいことに APIを使用できます。

public void removeDuplicateValue() {
    Map<Integer, String> existingMap = new HashMap<Integer, String>();
    existingMap.put(1, "a");
    existingMap.put(2, "b");

    // Create a new BiMap
    BiMap<Integer, String> biMap = HashBiMap.create();

    for (Integer val: existingMap.keySet()) {

        // forcePut will add a key-value pair, and overwrite the duplicate value.
        biMap.forcePut(val, existingMap.get(val));
    }

    // Create Inverse Map for newly created BiMap.
    BiMap<String, Integer> inverseBiMap = biMap.inverse();

    for(String val: inverseBiMap.keySet()) {
        System.out.println(val + ":" + biMap.get(val));
    }
}
于 2012-10-06T16:39:31.720 に答える
0

これを試してみてください..

 Map<String, String> myMap1 = new TreeMap<String, String>();
 myMap1.put("1", "One");
 myMap1.put("2", "Two");
 myMap1.put("3", "One");
 myMap1.put("4", "Three");
 myMap1.put("5", "Two");
 myMap1.put("6", "Three");

 Set<String> mySet = new HashSet<String>();

 for (Iterator itr = myMap1.entrySet().iterator(); itr.hasNext();)
 {
    Map.Entry<String, String> entrySet = (Map.Entry) itr.next();

    String value = entrySet.getValue();

    if (!mySet.add(value))
    {
        itr.remove();               
    }
 } 

  Map<String, String> myMap2 = new TreeMap<String, String>(myMap1);   

  System.out.println("Result :"+myMap2);

結果:{1=1、2=2、4=3}

于 2014-04-24T10:54:47.030 に答える