如何使用包含的Set <integer>反转地图?

时间:2017-02-14 03:10:19

标签: java

例如,如果我有一个带整数和字符串的地图:

Map<Integer, String> myMap = new HashMap<Integer, String>();

此地图将包含整数和名称值的键值 我要做的是创建一个新的地图,从地图复制所有的值(名称),并使它们成为新地图的关键。
现在我无法得到的棘手部分,是我想要的新地图的值是数字,但如果有多个数字对应同一个名称,我希望它们保存在一个集合中。 新地图示例:

Map<String, Set<Integer>> returnMap = new TreeMap<String, Set<Integer>>();

所以如果“John”对应1,2,3,4。我希望新地图包含一个包含1,2,3,4

的Set的“John”键

2 个答案:

答案 0 :(得分:5)

Google的Guava library有一个很好的Multimap类,它将键映射到多个值。如果您使用它,您可以利用一系列辅助方法:

SetMultimap<String, Integer> returnMap =
    Multimaps.invertFrom(Multimaps.forMap(myMap), TreeMultimap.create());

答案 1 :(得分:4)

这不是那么棘手:)

Map<Integer, String> map = ... //Your map
Map<String, Set<Integer>> reverseMap = new TreeMap<String, Set<Integer>>();

for(Map.Entry<Integer, String> entry : map.entrySet()) {
    Integer key = entry.getKey();
    String value = entry.getValue();
    Set<Integer> set;

    if(reverseMap.containsKey(value)) {
        set = reverseMap.get(value);
        set.add(key);
    } else {
        set = new HashSet<Integer>();
        set.add(key);
        reverseMap.put(value, set);
    }
}