Java 8 Java流维护收集器生成的映射顺序

Java 8 Java流维护收集器生成的映射顺序,java-8,stream,java-stream,Java 8,Stream,Java Stream,我有一个字符串类型的数据列表,试图将每个字符串的计数作为Map List dataList=new ArrayList(); addAll(Arrays.asList(新字符串[]{“a”、“z”、“c”、“b”、“a})); System.out.println(dataList.stream().collect(Collectors.groupby(w->w,Collectors.counting())); 输出是{a=2,b=2,c=1,z=1}。我希望输出保持列表中提供的顺序。比如,{

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

List dataList=new ArrayList();
addAll(Arrays.asList(新字符串[]{“a”、“z”、“c”、“b”、“a}));
System.out.println(dataList.stream().collect(Collectors.groupby(w->w,Collectors.counting()));
输出是
{a=2,b=2,c=1,z=1}
。我希望输出保持列表中提供的顺序。比如,
{a=2,z=1,c=1,b=2}

LinkedHashMap
将维护订单,但不确定如何使用
收集器。groupingBy()
将输出转换为
LinkedHashMap

尝试使用Java8 stream解决此问题
dataList.stream().collect(Collectors.groupingBy(w->w,LinkedHashMap::new,Collectors.counting())
在这种情况下,您应该使用
groupingBy(函数不像给定的解决方案那么简单,只是为了说明:您也可以使用树形图和合适的比较器,如:

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);
List List=Arrays.asList('q','a','z','c','b','z','a');
Comparator comp=比较器比较(列表::indexOf);
Map=list.stream()
.collect(分组方式(c->c,()->new TreeMap(comp),counting())
;
系统输出打印项次(map);
类型cast
(供应商)
应该不是必需的。一个简单的
数据列表.stream().collect(groupingBy(w->w,LinkedHashMap::new,counting())
应该可以…
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())));
    }
}
{a=2, z=1, c=1, b=1}
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);