我有一个字符串类型的数据列表,试图将每个字符串的计数作为Map<String, Long>
。
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流解决问题。
发布于 2017-09-15 18:28:29
对于这种情况,您应该使用groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory,Collector<? super T,A,D> downstream)
函数:
代码示例:
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}
参考资料:Oracle文档
发布于 2017-09-15 18:18:49
Per JB Nizet dataList.stream().collect(Collectors.groupingBy(w -> w, LinkedHashMap::new, Collectors.counting()))
发布于 2017-09-16 06:46:06
不像给定的解决方案那么简单,但只是为了说明:您也可以使用TreeMap,并使用适当的比较器,例如:
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);
https://stackoverflow.com/questions/46245199
复制相似问题