如何在ArrayList中查找重复值并统计其出现次数及对应金额总和
解决方案
实现思路
- 遍历ArrayList中的每个字符串元素,用
-作为分隔符拆分出数据标识和对应的金额数值 - 创建临时存储结构,用HashMap做映射,key为数据标识,value封装总金额和出现次数两个属性
- 遍历过程中累加对应key的金额和计数,遍历完成后格式化输出结果
完整示例代码
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; // 统计数据封装类 class Stats { private double totalAmount; private int count; public Stats(double amount) { this.totalAmount = amount; this.count = 1; } public void add(double amount) { this.totalAmount += amount; this.count++; } public double getTotalAmount() { return totalAmount; } public int getCount() { return count; } } public class ArrayListStats { public static void main(String[] args) { ArrayList<String> al = new ArrayList<String>(); al.add("aa-10.00"); al.add("bb-15.00"); al.add("aa-20.00"); al.add("aa-30.00"); al.add("bb-10.00"); Map<String, Stats> statsMap = new HashMap<>(); for (String item : al) { // 拆分字符串获得标识和金额 String[] parts = item.split("-"); String dataKey = parts[0]; double amount = Double.parseDouble(parts[1]); if (statsMap.containsKey(dataKey)) { // 已存在的标识直接累加数值 statsMap.get(dataKey).add(amount); } else { // 新标识新增映射 statsMap.put(dataKey, new Stats(amount)); } } // 格式化输出结果 System.out.printf("%-8s%-8s%s\n", "data", "amount", "count"); for (Map.Entry<String, Stats> entry : statsMap.entrySet()) { System.out.printf("%-8s%.2f %d\n", entry.getKey(), entry.getValue().getTotalAmount(), entry.getValue().getCount()); } } }
JDK8+简化写法
无需自定义封装类,直接使用Stream流和JDK自带的DoubleSummaryStatistics实现统计:
import java.util.ArrayList; import java.util.DoubleSummaryStatistics; import java.util.stream.Collectors; public class ArrayListStatsStream { public static void main(String[] args) { ArrayList<String> al = new ArrayList<String>(); al.add("aa-10.00"); al.add("bb-15.00"); al.add("aa-20.00"); al.add("aa-30.00"); al.add("bb-10.00"); var statsMap = al.stream() .map(item -> item.split("-")) .collect(Collectors.groupingBy( parts -> parts[0], Collectors.summarizingDouble(parts -> Double.parseDouble(parts[1])) )); System.out.printf("%-8s%-8s%s\n", "data", "amount", "count"); statsMap.forEach((key, stats) -> { System.out.printf("%-8s%.2f %d\n", key, stats.getSum(), stats.getCount()); }); } }
输出结果
data amount count aa 60.00 3 bb 25.00 2
内容的提问来源于stack exchange,提问作者arun
相关产品推荐
相关产品推荐

