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

Java中如何合并ArrayList内同名元素并累加数量?

合并ArrayList中同名元素的实现方案

核心思路

利用Map的键唯一性,以元素名称作为键,遍历原始列表时累加同名元素的数量,最后将Map中的值转换为新的ArrayList即可完成合并。

步骤1:定义元素实体类

首先需要定义包含名称和数量属性的实体类,示例如下:

class Item {
    private String name;
    private int count;

    public Item(String name, int count) {
        this.name = name;
        this.count = count;
    }

    // Getter & Setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getCount() { return count; }
    public void setCount(int count) { this.count = count; }

    // 重写toString方便结果查看
    @Override
    public String toString() {
        return "名称:" + name + ",数量:" + count;
    }
}

步骤2:基础遍历实现合并

通过普通循环结合HashMap完成合并逻辑,代码直观易懂:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MergeItems {
    public static void main(String[] args) {
        // 初始化原始列表
        List<Item> originalList = new ArrayList<>();
        originalList.add(new Item("Apple", 2));
        originalList.add(new Item("Apple", 3));
        originalList.add(new Item("Banana", 1));
        originalList.add(new Item("Banana", 2));

        Map<String, Item> itemMap = new HashMap<>();
        for (Item item : originalList) {
            if (itemMap.containsKey(item.getName())) {
                // 累加同名元素的数量
                Item existingItem = itemMap.get(item.getName());
                existingItem.setCount(existingItem.getCount() + item.getCount());
            } else {
                // 新元素直接存入Map
                itemMap.put(item.getName(), item);
            }
        }

        // 转换为合并后的ArrayList
        List<Item> mergedList = new ArrayList<>(itemMap.values());

        // 输出结果
        mergedList.forEach(System.out::println);
    }
}

步骤3:Java 8 Stream简化实现

如果使用Java 8及以上版本,可通过Stream API的Collectors.toMap方法简化代码:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class MergeItemsWithStream {
    public static void main(String[] args) {
        List<Item> originalList = new ArrayList<>();
        originalList.add(new Item("Apple", 2));
        originalList.add(new Item("Apple", 3));
        originalList.add(new Item("Banana", 1));
        originalList.add(new Item("Banana", 2));

        // 使用Stream合并同名元素
        List<Item> mergedList = originalList.stream()
                .collect(Collectors.toMap(
                        Item::getName,  // 以名称作为Map的键
                        item -> item,   // 以当前元素作为值
                        // 键重复时的合并逻辑:累加数量
                        (existing, newItem) -> {
                            existing.setCount(existing.getCount() + newItem.getCount());
                            return existing;
                        }
                ))
                .values()
                .stream()
                .collect(Collectors.toList());

        mergedList.forEach(System.out::println);
    }
}

输出结果

两种方式运行后都会得到合并后的列表:

名称:Apple,数量:5
名称:Banana,数量:3

内容的提问来源于stack exchange,提问作者ineedmoney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:35:15