2017-08-26 88 views
3

我有一個List<String>,我要它,轉換成Map,通過分組長度相同String s轉換爲List使用String長度爲重點,分類順序。它可以使用 -字符串轉換列表排序的地圖字符串長度爲重點

Map<Integer, List<String>> result = new TreeMap<>(); 
for (String str : list) { 
    if (!result.containsKey(str.length())) { 
     result.put(str.length(), new ArrayList<>()); 
    } 
    result.get(str.length()).add(str); 
} 

我們怎樣才能使用Java 8流?

+0

你試過了什麼?你遇到了什麼問題?你有沒有嘗試在發佈之前查找你的問題? – Alexander

回答

2

您可以用流做到這一點:關鍵映射功能,地圖的供應商和下游收集:

Map<Integer, List<String>> result = list.stream() 
    .collect(Collectors.groupingBy(
     String::length,  // use length of string as key 
     TreeMap::new,   // create a TreeMap 
     Collectors.toList())); // the values is a list of strings 

這由Collectors.groupingBy接受3個參數的過載的手段收集流。

然而,有做一個更緊湊的方式,沒有流:

Map<Integer, List<String>> result = new TreeMap<>(); 
list.forEach(s -> result.computeIfAbsent(s.length(), k -> new ArrayList<>()).add(s)); 

這使用List.forEachMap.computeIfAbsent達到你想要的東西。

+1

感覺很好,讓你回來:) – Eugene

+0

@Eugene嗨!謝謝! –

7

Java的流可以通過分組收藏家被分爲地圖,作出一個最簡單的方法是使用

Collectors.groupBy(comparator)

其中比較流值轉換爲地圖鍵。

返回是比較關鍵的一個Map條目

列表
public class Test { 
    public static void main(final String... args) { 
    List<String> in = Arrays.asList("A", "AB", "B", "ABC"); 
    final Map<Integer, List<String>> all = in.stream() 
     .collect(Collectors.groupingBy(String::length)); 
    System.out.println(all); 
    } 
} 

輸出:

{1=[A, B], 2=[AB], 3=[ABC]}

+1

我在IDE中將JDK 9設置爲我的默認設置,我將'List.of'更改爲'Arrays.asList',以使我的答案與Java 8兼容 – jrtapsell

2

您可以在一個符合groupingBy做到這一點在Java中8。

result = list.stream().collect(Collectors.groupingBy(String::length)); 
相關問題