簡體   English   中英

有沒有更好的方法來使用Java 8來填充LinkedHashMap?

[英]Is there a better way to write using the Java 8 to populate the LinkedHashMap?

我有一些代碼可以分割一個字母串,用它制作一個List,然后用字母及其頻率填充CharacterInteger的LinkedHashMap。 代碼如下,

   List<String> values = Arrays.asList((subjects.split(",")));
            for (String value : values) {
                char v = value.charAt(0);
                map.put(v, map.containsKey(v) ? map.get(v) + 1 : 1);
            }
            map.put('X', 0);

如何用Java 8簡潔地編寫它? 謝謝。

嘗試這個:

LinkedHashMap<Character, Long> counts = Pattern.compile(",")
        .splitAsStream(subjects)
        .collect(Collectors.groupingBy(
                s -> s.charAt(0),
                LinkedHashMap::new,
                Collectors.counting()));

如果你必須有一個Integer計數,你可以像這樣包裝計數收集器:

Collectors.collectingAndThen(Collectors.counting(), Long::intValue)

另一種選擇(感謝@Holger ):

Collectors.summingInt(x -> 1)

作為旁注,您可以使用以下代碼替換循環更新:

map.merge(v, 1, Integer::sum);

一個班輪:

Map<String, Long> frequency = Arrays.stream(input.split("(?<=.)\\W*"))
    .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

這會計算所有“單詞”字符(字母和數字)。

所以你正在尋找類似的東西:

Map<Character, Integer> result = new LinkedHashMap<>();
Arrays.asList(subjects.split(""))
      .stream().map(s -> s.charAt(0))
      .forEach(c -> result.put(c, result.containsKey(c) ? result.get(c) + 1 : 1));

而更好的解決方案是

Map<Character, Integer> result = new LinkedHashMap<>();
subjects.chars().mapToObj(c->(char)c)
    .forEach(c -> result.put(c, result.containsKey(c) ? result.get(c) + 1 : 1));

暫無
暫無

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

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