Java中如何统计ArrayList内int数组的出现次数并按规则输出
实现方案
核心思路
int数组的默认equals方法比较的是内存地址而非数组内容,因此我们使用LinkedHashMap完成统计:它既可以保留数组在原列表中首次出现的顺序,又能方便统计每个数组的出现次数。
- 遍历存储int数组的ArrayList,将每个数组的内容转为唯一标识(本方案用内容字符串,也可转为
List<Integer>)作为Map的key,value存储对应数组的出现次数 - 遍历统计完成的Map,按需求格式输出即可
完整修改代码
import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; public class ArrayCountDemo { public static void main(String[] args) { int[] a1 = {1,2,3,4,5}; int[] a2 = {1,2,3,4,5}; int[] a3 = {1,2,3,4,5}; int[] a4 = {2,5,7,8,9}; int[] a5 = {2,5,7,8,9}; int[] a6 = {3,4,6,8,9}; ArrayList<int[]> list = new ArrayList<>(); list.add(a1); list.add(a2); list.add(a3); list.add(a4); list.add(a5); list.add(a6); // 统计数组出现次数,保留首次出现的顺序 Map<String, Integer> countMap = new LinkedHashMap<>(); for (int[] arr : list) { String arrContent = Arrays.toString(arr); countMap.put(arrContent, countMap.getOrDefault(arrContent, 0) + 1); } // 按要求格式输出 for (Map.Entry<String, Integer> entry : countMap.entrySet()) { // 移除Arrays.toString生成的前后中括号,匹配目标输出格式 String content = entry.getKey().substring(1, entry.getKey().length() - 1); Integer count = entry.getValue(); if (count > 1) { System.out.printf("%s (%d)%n", content, count); } else { System.out.println(content); } } } }
兼容低版本JDK说明
如果你使用的JDK版本低于8,不支持getOrDefault方法,可以将统计逻辑替换为如下写法:
for (int[] arr : list) { String arrContent = Arrays.toString(arr); if (countMap.containsKey(arrContent)) { countMap.put(arrContent, countMap.get(arrContent) + 1); } else { countMap.put(arrContent, 1); } }
内容的提问来源于stack exchange,提问作者HarryVu176
相关产品推荐
相关产品推荐

