2012-09-17 65 views
2

我有一个映射,其中键是一个字符串,值是逗号分隔的值列表。如何变换映射中的键/值

我怎样才能扭转键/值对的顺序,并分配给新的地图,使键成为值和值将成为关键

所以:

key value 
key1 value1,value2,value3 
key2 value1,value4,value5   
key3 value4,value2,value1 

变为:

key  value 
value1 key1,key2,key3 
value2 key1,key3 
value3 key1 
value4 key2,key3 
value5 key2 

一个可能的解决方案是遍历每个值,然后迭代每个键 搜索相同的对应值。如果找到这个新的键/值对添加到一个新的地图。 这似乎效率低下?

溶液(使用接受的答案实现):

import java.util.HashMap; 
import java.util.Map; 

public class MapTransformer { 

    public static void main(String args[]) { 

     Map<String, String> m1 = new HashMap<String, String>(); 

     m1.put("key1", "value1,value2"); 
     m1.put("key2", "value5"); 
     m1.put("key3", "value4,value2,value1"); 

     Map<String, String> inverseMap = new HashMap<String, String>(); 
     for (Map.Entry<String, String> entry : m1.entrySet()) { 
      for (String value : entry.getValue().split(",")) { 
       if (inverseMap.containsKey(value)) 
        inverseMap.put(value, inverseMap.get(value) + "," + entry.getKey()); 
       else 
        inverseMap.put(value, entry.getKey()); 
      } 
     } 

     for (Map.Entry<String, String> entry : inverseMap.entrySet()) { 
      String key = entry.getKey(); 
      String value = entry.getValue(); 
      System.out.println(key+" "+value); 
     } 
    } 

} 
+0

你也可以检查这个。看起来相似。 http://stackoverflow.com/questions/7549640/reversing-a-hashmap-from-mapstring-boolean-to-mapboolean-liststring – titogeo

回答

2
Map<String,String> initialMap = ... 
Map<String,String> inverseMap = new HashMap<String,String>(); 
for (Map.Entry<String,String> entry: initialMap.entrySet()) { 
    for (String v : entry.getValue().split(",")) { 
     if (inverseMap.containsKey(v)) 
      inverseMap.put(v,inverseMap.get(v)+","+entry.getKey()); 
     else 
      inverseMap.put(v, entry.getKey()); 
    } 
} 

请注意,这并不在逆映射的字符串进行排序来表示。要做到这一点,您可以通过反向贴图分割和重新加入字符串来进行第二次迭代。

一个更好的解决方案是将数据作为SortedMap<String,SortedSet<String>>

0
Map<Value, Key> reverseMap = new HashMap<Value, Key>(); 
for (Map.Entry<Key, Value> entry : map) { 
    reverseMap.put(entry.getValue(), entry.getKey()); 
} 

的假设是,各(键,值)对是在原地图不同,所以逆转的过程中不存在重写地图。

3

看起来你有很多地图地图。

这可以通过使用

Map<K, List<V>> map1 = new LinkedHashMap<K, List<V>>(); 
Map<V, List<K>> map2 = new LinkedHashMap<V, List<K>>(); 
for (Map.Entry<K, List<V>> entry : map1.entrySet()) { 
    for (V v : entry.getValue()) { 
     List<K> list2 = map2.get(v); 
     if (list2 == null) 
      map2.put(v, list2 = new ArrayList<K>()); 
     list2.add(entry.getKey()); 
    } 
} 
2

您可以使用模型谷歌番石榴的BiMap

BiMap<?, ?> bimap = HashBiMap. create(); 
BiMap<?, ?> reverse = bimap.inverse(); // Do this only once after the BiMap has been created. 
1

如果值列表这可能帮助:

Map<String, List<String>> reverseMap = new HashMap<String, List<String>>(); 

for(Entry`<String, List<String>>` entry : map.entrySet()) 
{ 
    for(String str : entry.getValue()) 
    { 
     if(reverseMap.get(str) != null){ 
      reverseMap.get(str).add(entry.getKey());    
     } else { 
      List<String> list = new ArrayList<String>(); 
      list.add(entry.getKey()); 
      reverseMap.put(str, list); 
     } 
    } 
}