如何在Java中按出现频率输出ArrayList的元素及其次数
Java实现方案
方法1:TreeMap通用实现(兼容JDK 1.6及以上版本)
核心思路:利用TreeMap天然支持Key的自然排序特性,无需额外排序即可匹配输出要求的字母升序规则,遍历列表统计次数后直接输出即可。
import java.util.ArrayList; import java.util.Map; import java.util.TreeMap; public class ElementCount { public static void main(String[] args) { // 初始化目标ArrayList ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("D"); list.add("E"); list.add("C"); list.add("A"); list.add("A"); list.add("B"); Map<String, Integer> countMap = new TreeMap<>(); // 统计元素出现次数 for (String element : list) { // JDK8及以上可用getOrDefault写法 countMap.put(element, countMap.getOrDefault(element, 0) + 1); // JDK8以下版本替换为以下逻辑 /* if (countMap.containsKey(element)) { countMap.put(element, countMap.get(element) + 1); } else { countMap.put(element, 1); } */ } // 按要求格式输出 for (Map.Entry<String, Integer> entry : countMap.entrySet()) { System.out.println(entry.getKey() + "," + entry.getValue()); } } }
方法2:Stream流式实现(JDK8及以上版本,写法更简洁)
核心思路:直接通过Stream的分组聚合能力,指定用TreeMap存储结果,一步完成统计和排序,流式输出结果。
import java.util.ArrayList; import java.util.TreeMap; import java.util.stream.Collectors; public class ElementCountStream { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("D"); list.add("E"); list.add("C"); list.add("A"); list.add("A"); list.add("B"); // 流式统计、排序并输出 list.stream() .collect(Collectors.groupingBy( element -> element, TreeMap::new, Collectors.counting() )) .forEach((key, count) -> System.out.println(key + "," + count)); } }
两种实现的输出结果完全符合要求:
A,3 B,2 C,1 D,1 E,1
内容的提问来源于stack exchange,提问作者hans
相关产品推荐
相关产品推荐

