游戏修复任务中玩家物品栏重复物品的处理方案咨询
解决修复任务重复物品处理问题
当前代码的核心问题是未考虑修复任务所需物品的数量限制,只要物品名称匹配就会移除玩家背包中所有同名物品,无法处理“需要N个同名物品”的场景。以下是可行的修复方案:
第一步:完善所需物品的定义
首先给RepairItem添加数量属性,因为修复任务必然需要明确每种物品的需求数量:
public class RepairItem extends Item { private int requiredCount; public RepairItem(String name, String description, int requiredCount) { super(name, description); this.requiredCount = requiredCount; } public int getRequiredCount() { return requiredCount; } public void setRequiredCount(int requiredCount) { this.requiredCount = requiredCount; } }
第二步:重写tryRepair方法逻辑
修改后的逻辑会按需求数量匹配并移除物品,而不是全部移除同名物品:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public boolean tryRepair(List<Item> inventory) { // 1. 统计玩家背包中各物品的数量(按名称分组) Map<String, Long> inventoryItemCount = inventory.stream() .collect(Collectors.groupingBy(Item::getName, Collectors.counting())); List<Item> toRemove = new ArrayList<>(); completed = true; // 2. 遍历所需物品,逐个检查数量是否满足(用副本避免遍历中修改原列表) for (RepairItem required : new ArrayList<>(requiredItems)) { String itemName = required.getName(); long available = inventoryItemCount.getOrDefault(itemName, 0L); if (available >= required.getRequiredCount()) { // 从背包中移除对应数量的物品 int removed = 0; Iterator<Item> iterator = inventory.iterator(); while (iterator.hasNext() && removed < required.getRequiredCount()) { Item item = iterator.next(); if (item.getName().equals(itemName)) { toRemove.add(item); iterator.remove(); removed++; } } repairedItems.add(required); requiredItems.remove(required); // 移除已完成的需求项 } else { completed = false; // 有物品数量不足,任务未完成 } } return completed; }
关键改动说明
- 统计物品数量:用Stream API快速统计背包中每种物品的存量,避免重复遍历带来的性能损耗
- 按需求数量移除:使用迭代器逐个移除对应数量的物品,确保只扣除任务需要的数量,不会多删
- 遍历副本修改原列表:遍历
requiredItems的副本,避免在遍历过程中修改原列表引发并发修改异常 - 修正完成状态判断:只要有任意一种物品数量不足,任务就标记为未完成,逻辑更准确
额外优化建议
- 给
Item类重写equals和hashCode方法,基于name和description实现,避免同名不同物品的误判 - 如果物品有唯一ID,优先用ID而非名称来匹配,进一步提升匹配准确性
内容的提问来源于stack exchange,提问作者Enes




