[英]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.