我有两个hashmap(resources和neededResources) 目标是减少hashmap的资源量,但只有当它具有足够的两种资源时才会发生这种情况。
// String = name of resources available
// Integer = amount of resources available
Map<String, Integer> resources = new HashMap<>();
resources.put("gold", 10);
resources.put("silver", 10);
// String = name of resource needed
// Integer = amount of resource needed
Map<String, Integer> neededResources = new HashMap<>();
neededResources.put("gold", 2);
neededResources.put("silver", 3);
在这个样本案例中,从第4次尝试开始就需要3次资源,没有足够的白银,黄金价值也不会改变。
我是Java的新手。到目前为止,我已经尝试迭代它们,但它变得难以阅读,我的尝试对于这项任务看起来太难了。
答案 0 :(得分:1)
从资源图中获取值,从requiresResources中减去该值,并检查它是否为&gt; = 0。这告诉您至少有可用的资源。如果资源可用,请更新该值。否则不要。
在资源类
中创建方法包装器public boolean hasResources(String... pResources){
for(String resourceKey : pResources){
int newValue = resources.get(pResourceKey) - neededResources.get(pResourceKey);
if(newValue < 0){
return false;
}
}
return true;
}
public void takeResources(String... pResources){
for(String resourceKey : pResources){
int newValue = resources.get(pResourceKey) - neededResources.get(pResourceKey);
resources.put(resourceKey, newValue);
}
}
答案 1 :(得分:1)
此问题的关键在于我们不想修改resources
Map
,除非我们完全确定它包含所有resourcesNeeded
。一旦了解了Java中的Stream
,就应该简化这个问题。
首先,我们要检查resources
Map
是否包含resourcesNeeded
Map
中的所有密钥,这些密钥可能已经或可能没有给出您的信息没有提到。
resources.keySet().containsAll(neededResources.keySet());
如果该条件为false
,那么我们就知道有必要的资源不可用。否则,我们现在可以检查resources
中的每个值是否大于或等于resourcesNeeded
中各自键的值:
resources.entrySet()
.stream()
.allMatch(entry -> entry.getValue() >= resourcesNeeded.get(entry.getKey()));
如果该条件为false
,则需要更多资源,然后才能使用。否则,我们现在可以修改resources
,基本上减去resourcesNeeded
中的每个相应值:
resources.replaceAll((k, v) -> v - resourcesNeeded.getOrDefault(k, 0)));
最后两个语句可以放在循环内部,以确保保留最少量的资源。
答案 2 :(得分:1)
我认为这可能就是你所追求的。可以在设置代码后插入代码。
查找可能的支出数量:
int n = resources.entrySet().stream().mapToInt(entry -> entry.getValue()/neededResources.getOrDefault(entry.getKey(), 0)).min().getAsInt();
System.out.println(n);
打印3
花钱:
resources.replaceAll((k,v) -> v-n*neededResources.getOrDefault(k,0));
System.out.println(resources);
打印{gold = 4,silver = 1}