将地图值分组以避免重复

时间:2017-05-09 09:46:16

标签: java collections

我有一个Map(map1),其键是另一个map(map2),value是string。

map1的值有几个重复,所以我必须将它们分组并在另一个map3中设置为key,其值必须是map2。

eg:

map1 {  [[a,b],xyz],  [[c,d],wrt] , [[e,f],xyz] , [[r,m],xyz]  }


output should be :

map3 {  [ xyz,[ [a,b],[e,f],[r,m] ] ]  , [ wrt,[ [c,d] ]
我可以这样获得吗?

4 个答案:

答案 0 :(得分:0)

从(commons-collections)库中尝试MultiValueMap

Map map1 = new HashMap<String[], String>();
map1.put(new String[]{"a", "b"}, "xyz");
map1.put(new String[]{"c", "d"}, "wrt");
map1.put(new String[]{"e", "f"}, "xyz");
map1.put(new String[]{"c", "d"}, "xyz");

MultiValueMap map2 = new MultiValueMap();
for(String[] key: map1.keySet()) {
    String value = map1.get(key);
    map2.add(value, key);
}
// now you got map2 as you want

答案 1 :(得分:0)

不,虽然您可以声明但在使用它时,它可能允许相同的键(人类可读)。因为Map不会覆盖Object的equals方法,所以您的密钥比较将在JVM的对象级别上(对于具有相同值的对象,它可能不同)。

答案 2 :(得分:0)

您可以使用流API来解决它:

Map<String, List<Map<String, String>>> map3 = map.entrySet().stream()
    .collect(Collectors.groupingBy(Entry::getValue,
                                   Collectors.mapping(Entry::getKey,
                                                      Collectors.toList())));

说明: 条目将按其值(groupingBy(Entry::getValue)分组。 但是值不应该是条目列表,因此下游是必要的。这是原始地图的键列表。

答案 3 :(得分:0)

从您的帖子中我们不清楚map2是什么意思,但我们假设您希望Map.Entry<String, String> entry使用每个map2 map1的每个键public class MapReverser { private Map<Map.Entry<String, String>, String> map1 = new HashMap<>(); private Map<String, String> map2 = new LinkedHashMap<>(); private void prepareMaps() { map2.put("a", "b"); map2.put("c", "d"); map2.put("e", "f"); map2.put("r", "m"); String[] valueArray = { "xyz", "wrt", "xyz", "xyz" }; int i = 0; for (Map.Entry<String, String> entry : map2.entrySet()) { map1.put(entry, valueArray[i]); i++; } } public Map<String, List<Map.Entry<String, String>>> reverse() { Map<String, List<Map.Entry<String, String>>> reversedMap = new HashMap<>(); for (Map.Entry<Map.Entry<String, String>, String> entry : map1.entrySet()) { List<Map.Entry<String, String>> reversedMapValue = reversedMap.get(entry.getValue()); if (reversedMapValue == null) { reversedMapValue = new ArrayList<>(); } reversedMapValue.add(entry.getKey()); reversedMap.put(entry.getValue(), reversedMapValue); } return reversedMap; } private void printResult(Map<String, List<Map.Entry<String, String>>> reversedMap) { for (Map.Entry<String, List<Map.Entry<String, String>>> entry : reversedMap.entrySet()) { System.out.println("Key: \n" + entry.getKey()); System.out.println("Values:"); List<Map.Entry<String, String>> valuesList = entry.getValue(); for (Map.Entry<String, String> value : valuesList) { System.out.println(value ); } System.out.println("\n"); } } public static void main(String[] args) { MapReverser mapReverser = new MapReverser(); mapReverser.prepareMaps(); Map<String, List<Map.Entry<String, String>>> reversedMap = mapReverser.reverse(); mapReverser.printResult(reversedMap); } }

以下代码是Java 7,它有点冗长。我想可以用Java 8流来缩短它。

col1   col2
a      1
b      2
c      2
d      1
e      1