[英]Comparing integer values of 2 or more keys of one hashmap to 2 values in another hashmap
我有两个哈希图(资源和requiredResources)。
目标是减少哈希表的资源量,但这只有在两个资源都足够的情况下才能实现。
// 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);
在此示例中,由于第四次尝试将没有足够的白银,黄金价值也没有变化,因此将需要3倍的资源。
我是Java的新手。 到目前为止,我已经尝试了遍历这两个方法,但是变得很难阅读,而且我的尝试看起来很难完成该任务。
从资源映射中获取值,从requiredResources中减去该值,然后检查其是否> = 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);
}
}
这个问题的关键在于,除非我们完全确定它包含所有需要的resourcesNeeded
,否则我们不想修改resources
Map
。 一旦您了解了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)));
可以将最后两个语句放在循环内部,以确保剩余最少的资源。
我认为这可能是您追求的目标。 该代码可以插入您的设置代码之后。
查找可能的支出数量:
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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.