You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:27:02