将map字符串转换为map字符串列表字符串 - Java 7

问题描述 投票:0回答:2

我有一个字符串的映射列表string(List<Map<String,String>>)像波纹一样。

[{key = "car", value = "bmw"},{key = "car", value = "suzuki"},{key = "car", value = "hyundai"},{key = "bike", value = "honda"},{key = "bike", value = "tvs"}]

我想把下面的地图转换成列表字符串列表(List<Map<String, List<String>>>)或同等的东西

[{key = "car", value = ["bmw","suzuki","hyundai"]},{key = "bike", value = ["honda","tvs"]}]

先谢谢你。

java hibernate java-7
2个回答
2
投票

Java 8以上

对于单子地图

使用groupingBy通过键来分离,然后通过映射来获得你的单子地图的值。

Map<String, List<String>> res = 
  list.stream()
    .map(map -> map.entrySet().iterator().next())
    .collect(Collectors.groupingBy(
      entry -> entry.getKey(),
      Collectors.mapping(
        entry -> entry.getValue(), 
        Collectors.toList()
      )
    )
  );

对于有多个条目的地图

你做的事情和上面一样,但flatMap可以在一个一维流中得到所有的条目。

Map<String, List<String>> res = 
  list.stream()
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.groupingBy(
      entry -> entry.getKey(),
      Collectors.mapping(
        entry -> entry.getValue(), 
        Collectors.toList()
      )
    )
  );

Pre-Java 8

对于有多个条目的地图

你必须遍历列表中的每个地图,然后遍历每个地图的条目。对于每个条目,检查键是否已经在那里,如果是,则将值添加到与该键相关的列表中。如果键不在结果地图中,则在那里创建一个新的列表。

Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
  for (Map.Entry<String, String> e : m.entrySet()) {
    String key = e.getKey();
    if (!map.containsKey(key)) {
      map.put(key, new ArrayList<String>());
    }
    map.get(key).add(e.getValue());
  }
}

对于单胎地图

对于你的原始列表中的每一张地图,你找到第一个条目,然后你做与上面相同的操作:将该条目的值添加到该条目的键映射到的列表中,在这之前,如果该键还没有存在于该地图中,则为该地图添加一个新的List。

Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
  Map.Entry<String, String> e = m.entrySet().iterator().next();
  String key = e.getKey();
  if (!map.containsKey(key)) {
    map.put(key, new ArrayList<String>());
  }
  map.get(key).add(e.getValue());
}

0
投票

根据你的例子,你有一个这样的地图列表。

List<Map<String,String>> myListOfMaps = List.of(
        Map.of("car", "bmw"),
        Map.of("car", "suzuki"),
        Map.of("car", "hyundai"),
        Map.of("bike", "honda"),
        Map.of("bike", "tvs")                        
);

然后你可以使用流的groupingBy函数来做类似下面的事情。

将你的列表进行流式处理,通过流式处理入口集,将入口集按键分组,映射到一个值的列表上,使之扁平化

Map<String,List<String>> myResultMap = myListOfMaps.stream()
        .flatMap(m -> m.entrySet().stream())
        .collect(Collectors.groupingBy(
                Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

使用resultprint ...

myResultMap.forEach((k,v)-> {
    System.out.println(k + " : " + v);
});

// car : [bmw, suzuki, hyundai]
// bike : [honda, tvs]
© www.soinside.com 2019 - 2024. All rights reserved.