将一个散列映射的2个或更多键的整数值与另一个散列映射中的2个值进行比较

时间:2018-03-07 19:35:55

标签: java hashmap

我有两个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的新手。到目前为止,我已经尝试迭代它们,但它变得难以阅读,我的尝试对于这项任务看起来太难了。

3 个答案:

答案 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}