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

如何最优实现Map<Faction, List<Resource>>到各阵营资源计数Map的转换

实现方案

Stream流式实现(最优推荐)

代码简洁易维护,符合Java 8+的最佳实践,核心逻辑一行流即可完成统计:

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

// 入参为你原始存储的Map<Faction, List<Resource>>结构
public Map<Resource, Integer> countAllResources(Map<Faction, List<Resource>> factionResources) {
    return factionResources.values().stream()
            // 展开所有阵营的资源列表为统一的资源流
            .flatMap(List::stream)
            // 按资源分组统计总数
            .collect(Collectors.toMap(
                    Function.identity(), // 键为资源枚举本身,如需字符串键替换为Resource::name
                    r -> 1, // 每个资源初始计数为1
                    Integer::sum // 重复资源的计数累加
            ));
}

逻辑说明:无需单独循环处理每个阵营,直接提取所有阵营的资源列表做扁平化处理,一次性完成分组计数,性能和可读性都较好。

普通foreach循环实现

适合需要在统计过程中插入自定义业务逻辑、或者需要断点调试的场景:

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

public Map<Resource, Integer> countAllResources(Map<Faction, List<Resource>> factionResources) {
    Map<Resource, Integer> countMap = new HashMap<>();
    // 遍历所有阵营的资源列表
    for (List<Resource> resourceList : factionResources.values()) {
        // 遍历单个阵营的所有资源
        for (Resource res : resourceList) {
            // 累加对应资源的计数
            countMap.put(res, countMap.getOrDefault(res, 0) + 1);
        }
    }
    return countMap;
}

适配说明

如果你需要的返回键是资源的字符串名称而非枚举对象,只需要把对应代码里的键取值逻辑替换为res.name()即可,完全兼容你给出的目标输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:15:03