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
相关产品推荐
相关产品推荐

