Java stream groupby并同时加入以进行csv导出
我有一个字符串列表: “蓝色” “红色” “蓝色” “黄色” 我希望对其进行流式处理并获得以下结果: “蓝色;2\nred;1\n黄色;1” 这样我就得到了颜色的csv,以及它们出现的次数 到目前为止,我一直在努力工作,以下是我所拥有的:Java stream groupby并同时加入以进行csv导出,java,java-stream,Java,Java Stream,我有一个字符串列表: “蓝色” “红色” “蓝色” “黄色” 我希望对其进行流式处理并获得以下结果: “蓝色;2\nred;1\n黄色;1” 这样我就得到了颜色的csv,以及它们出现的次数 到目前为止,我一直在努力工作,以下是我所拥有的: public static void main(String[] args) { System.out.println( List.of("blue", "red", "blue", "yellow")
public static void main(String[] args) {
System.out.println(
List.of("blue", "red", "blue", "yellow")
.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
);
// result: {red=1, blue=2, yellow=1}
}
只需对结果条目进行流式处理,并根据您的意愿对其进行处理:
String output = Stream.of("blue", "red", "blue", "yellow")
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
//.sorted(Comparator.comparing(Entry::getValue).reversed())
.map(e -> e.getKey() + ";" + e.getValue())
.collect(Collectors.joining("\n"));
不清楚订单是否是一项要求,但您可以先取消注释sorted
行以获得更高的计数
请注意,这不处理引用、转义等。如果您需要更复杂的CSV逻辑,您可能需要使用库。只需对结果项进行流式处理,并根据需要对其进行处理:
String output = Stream.of("blue", "red", "blue", "yellow")
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
//.sorted(Comparator.comparing(Entry::getValue).reversed())
.map(e -> e.getKey() + ";" + e.getValue())
.collect(Collectors.joining("\n"));
不清楚订单是否是一项要求,但您可以先取消注释sorted
行以获得更高的计数
请注意,这不处理引用、转义等。如果您需要更复杂的CSV逻辑,您可能需要使用库。a
LinkedHashMap
提供程序将为您排序密钥
import java.util.*;
导入java.util.function.function;
导入java.util.stream.collector;
公共类代码段{
公共静态void main(字符串[]args){
列表颜色=数组。asList(“蓝色”、“红色”、“蓝色”、“黄色”);
字符串输出=colors.stream()
.collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,
Collectors.counting())
.entrySet().stream().map(条目->条目.getKey()+“;”+条目.getValue())
.collect(收集器.连接(\\n”);
System.out.println(输出);//蓝色;2\nred;1\nyellow;1
}
}
ALinkedHashMap
提供商将为您排序密钥
import java.util.*;
导入java.util.function.function;
导入java.util.stream.collector;
公共类代码段{
公共静态void main(字符串[]args){
列表颜色=数组。asList(“蓝色”、“红色”、“蓝色”、“黄色”);
字符串输出=colors.stream()
.collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,
Collectors.counting())
.entrySet().stream().map(条目->条目.getKey()+“;”+条目.getValue())
.collect(收集器.连接(\\n”);
System.out.println(输出);//蓝色;2\nred;1\nyellow;1
}
}
那么按值排序,然后按频率排序?地图不能保证键的排序,除非您使用像树地图这样的东西,它在整个时间内保持平衡。您可以提供自己的Map
实现。@Mr.polywhillTreeMap
不会对值进行排序。@shmosel是的,您是对的,它保持原始顺序。。。不知道我在想什么。我指的是一个LinkedHashMap
;但问题仍然存在,您可以提供自己的地图。分组后使用库导出为CSV。所以按值排序,然后按频率排序?地图不能保证键的排序,除非您使用像树地图这样的东西,它在整个时间内保持平衡。您可以提供自己的Map
实现。@Mr.polywhillTreeMap
不会对值进行排序。@shmosel是的,您是对的,它保持原始顺序。。。不知道我在想什么。我指的是一个LinkedHashMap
;但关键仍然是,您可以提供自己的映射。使用库在分组后导出为CSV。或者您可以签出番石榴。或者您可以签出番石榴。LinkedHashMap不按键排序元素,但在迭代时保持输入顺序。LinkedHashMap不按键排序元素,但在迭代时保持输入顺序。