Java新手求助:两个HashMap资源值比对及批量扣除实现
嘿,作为Java新手碰到这种HashMap的资源扣减问题,一开始写得复杂很正常!我给你一个简洁又易读的方案,把逻辑拆得明明白白,绝对比你之前的嵌套遍历舒服多了。
核心思路
我们要做的其实就是两步循环:
- 先检查:确认
resources里的每一种资源,数量都能满足neededResources的要求(一个都不能少) - 再扣减:如果检查通过,就把每种资源的数量减去需求值,然后计数加1
- 重复上面两步,直到某次检查不通过为止
简洁代码实现
直接上代码,注释写得很清楚,新手也能一眼看懂:
import java.util.HashMap; import java.util.Map; public class ResourceDeductionDemo { public static void main(String[] args) { // 初始化你的资源和需求 Map<String, Integer> resources = new HashMap<>(); resources.put("金", 10); resources.put("银", 7); Map<String, Integer> neededResources = new HashMap<>(); neededResources.put("金", 2); neededResources.put("银", 2); int totalDeductions = 0; // 循环尝试扣减,直到无法满足需求 while (canPerformDeduction(resources, neededResources)) { performDeduction(resources, neededResources); totalDeductions++; System.out.println("完成第" + totalDeductions + "次扣减,当前资源:" + resources); } System.out.println("最终可执行的扣减次数:" + totalDeductions); } // 检查是否可以执行一次扣减操作 private static boolean canPerformDeduction(Map<String, Integer> resources, Map<String, Integer> needed) { // 用Stream.allMatch一次性验证所有需求资源是否都满足 return needed.entrySet().stream() .allMatch(entry -> { String resourceKey = entry.getKey(); int requiredAmount = entry.getValue(); // 确保资源存在,且数量足够 return resources.containsKey(resourceKey) && resources.get(resourceKey) >= requiredAmount; }); } // 执行一次资源扣减 private static void performDeduction(Map<String, Integer> resources, Map<String, Integer> needed) { // 遍历需求资源,逐个扣减 needed.entrySet().forEach(entry -> { String resourceKey = entry.getKey(); int deductAmount = entry.getValue(); resources.put(resourceKey, resources.get(resourceKey) - deductAmount); }); } }
代码解释
- 把检查和扣减拆成了两个独立的小方法,职责明确,可读性拉满,你以后维护或者修改逻辑也方便
canPerformDeduction用了Java 8的Stream API,allMatch会遍历所有需求资源,只有当所有资源都满足条件时才返回true,比手动写嵌套循环简洁太多performDeduction用forEach遍历需求,直接更新资源数量,逻辑清晰- 主逻辑就是一个简单的while循环,只要能扣减就执行,计数累加,完全没有复杂的嵌套结构
额外注意点
- 如果
neededResources里有resources不存在的资源,canPerformDeduction会直接返回false,不会执行扣减,符合逻辑 - 如果资源数量刚好等于需求,扣减后数量会变成0,下次循环就会检查不通过,停止扣减
- 这个方案完全适配你说的示例场景:金有10,银有7,每次各扣2,第3次扣完后金剩4,银剩1,第4次检查银不够,就停止,最终计数是3,和你预期的一致
内容的提问来源于stack exchange,提问作者k4rli
相关产品推荐
相关产品推荐

