You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

游戏修复任务中玩家物品栏重复物品的处理方案咨询

解决修复任务重复物品处理问题

当前代码的核心问题是未考虑修复任务所需物品的数量限制,只要物品名称匹配就会移除玩家背包中所有同名物品,无法处理“需要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类重写equalshashCode方法,基于namedescription实现,避免同名不同物品的误判
  • 如果物品有唯一ID,优先用ID而非名称来匹配,进一步提升匹配准确性

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

火山引擎 最新活动