簡體   English   中英

將一個哈希表的2個或更多鍵的整數值與另一個哈希表中的2個值進行比較

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM