簡體   English   中英

將 map 字符串轉換為 map 字符串列表字符串 - Java 7

[英]convert map string string to map string list string - Java 7

我有一個字符串字符串( List<Map<String,String>> )的 map 列表,如下所示,

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

我想轉換為下面的 map 字符串列表 string( List<Map<String, List<String>>> ) 或相等的列表

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

提前致謝。

Java 8+

對於 singleton 地圖

使用 groupingBy 鍵分隔,然后映射以獲取您的 singleton map 的值

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 獲取單個一維 stream 中的所有條目

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()
      )
    )
  );

Java 8 之前

對於具有多個條目的地圖

您必須遍歷列表中的每個 map,然后遍歷每個 map 的條目。 對於每個條目,檢查鍵是否已經存在,如果存在,則將值添加到與該鍵關聯的列表中。 如果密鑰不在結果 map 中,則在那里創建一個新列表。

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());
  }
}

對於 singleton 地圖

對於原始列表中的每個 map,您找到第一個條目,然后執行與上述相同的操作:將該條目的值添加到條目的鍵映射到的列表中,然后在此之前,將新列表添加到 map那里已經不存在密鑰。

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());
}

根據您的示例,您有一個這樣的地圖列表:

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 function 來執行類似於您在下面看到的操作。

Stream 您的列表,通過流式傳輸條目集來展平 stream,按其鍵將條目集分組,map 到值列表

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())));

使用結果/打印..

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

// car : [bmw, suzuki, hyundai]
// bike : [honda, tvs]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM