首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java维护由Collectors.groupingBy()生成的地图顺序

Java维护由Collectors.groupingBy()生成的地图顺序
EN

Stack Overflow用户
提问于 2017-09-15 17:55:04
回答 3查看 1.7K关注 0票数 2

我有一个字符串类型的数据列表,试图将每个字符串的计数作为Map<String, Long>

代码语言:javascript
运行
复制
List<String> dataList = new ArrayList();
dataList.addAll(Arrays.asList(new String[] {"a", "z", "c", "b", "a"}));
System.out.println(dataList.stream().collect(Collectors.groupingBy(w -> w, Collectors.counting())));

输出为{a=2, b=2, c=1, z=1}。我希望输出保持列表中提供的顺序。比如,{a=2, z=1, c=1, b=2}

LinkedHashMap将保持顺序,但不确定如何使用Collectors.groupingBy()将输出转换为LinkedHashMap

试图使用Java8 8流解决问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-15 18:28:29

对于这种情况,您应该使用groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory,Collector<? super T,A,D> downstream)函数:

代码示例:

代码语言:javascript
运行
复制
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.groupingBy;

public class Main {

    public static void main(String[] args){
        List<String> dataList = new ArrayList();
        dataList.addAll(Arrays.asList("a", "z", "c", "b", "a"));
        System.out.println(dataList.stream().collect(groupingBy(w -> w, (Supplier<LinkedHashMap<String, Long>>) LinkedHashMap::new, Collectors.counting())));
    }
}

输出:

代码语言:javascript
运行
复制
{a=2, z=1, c=1, b=1}

参考资料:Oracle文档

票数 2
EN

Stack Overflow用户

发布于 2017-09-15 18:18:49

Per JB Nizet dataList.stream().collect(Collectors.groupingBy(w -> w, LinkedHashMap::new, Collectors.counting()))

票数 2
EN

Stack Overflow用户

发布于 2017-09-16 06:46:06

不像给定的解决方案那么简单,但只是为了说明:您也可以使用TreeMap,并使用适当的比较器,例如:

代码语言:javascript
运行
复制
List<Character> list = Arrays.asList('q', 'a', 'z', 'c', 'b', 'z', 'a');
Comparator<Character> comp = Comparator.comparing(list::indexOf);
Map<Character, Long> map = list.stream()
    .collect(groupingBy(c -> c, () -> new TreeMap<>(comp), counting()))
;
System.out.println(map);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46245199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档