【问题标题】:How to only return true when all conditions in for loop are true?当for循环中的所有条件都为真时,如何只返回真?
【发布时间】:2017-10-29 21:30:00
【问题描述】:
  • 我有一个 keyStore,它可以包含一个或多个键值对
  • 我有一个 nodeMap,它可以包含一个或多个键值对
  • keyStore 中的所有键都必须存在于 nodeMap 中,并且 keyStore 中的所有键值对必须在 nodeMap 中匹配才能返回 true

例如:

keyStore {key1=>value1}
nodeMap  {key1=>value1, key2=>value2}
return true

----

keyStore {key1=>value1, key2=>value2}
nodeMap  {key1=>value1, key2=>value2}
return true

----

keyStore {key1=>value1, key3=>value3}
nodeMap  {key1=>value1, key2=>value2}
return false;

----

keyStore {key1=>value1, key3=>value3}
nodeMap  {key1=>value1, key2=>value2, key3=>value3}
return true;

代码:

private boolean checkForMatch(NamedNodeMap nodeMap, Map<String, String> keyStore)
   {
      boolean foundMatch = false;
      for (int i = 0; i < nodeMap.getLength(); i++)
      {
         Node node = nodeMap.item(i);
         String nodeName = node.getNodeName();
         if (keyStore.containsKey(nodeName))
         {
            if (keyStore.get(nodeName).contains(node.getNodeValue()))
            {
               foundMatch = true;
            }
            else
            {
               foundMatch = false;
               break;
            }
         }
      }
      return foundMatch;
   }

这不起作用有几个原因,例如,当 nodeMap 包含许多键值对但 keyStore 仅包含一个键值对时,而第一个条件失败然后循环中断,而不是继续。

【问题讨论】:

  • 你在问一个关于 keyStore 的问题,所以你的循环首先不应该针对 nodeMap 循环。一般来说,这是一个 forall 关系,因此您可以检查人们将如何实现它。

标签: java for-loop boolean boolean-logic


【解决方案1】:

让我们尽量不要把事情复杂化,你只需要检查keyStore中的所有元素是否都存在于nodeMap中。

步骤:

  • 检查 keyStore 大小是否大于 nodeMap 大小,如果是则返回 false nodeMap 不能容纳所有 keyStore 的元素
  • 检查 keyStore 中是否有任何元素与 nodeMap 不匹配返回 false
  • 除此之外返回 true

这是一个简单的方法:

if(keyStore.size() > nodeMap.getLength())
              return false;
          int count = 0;
          for (String key: keyStore.keySet())
          {
             if(keyStore.get(key) != nodeMap.item(count).getNodeValue())
                 return false;
          }
          return true; 

【讨论】:

  • 比较键和值怎么样?
  • 您可以简单地在 for 循环内的 if 中添加一个条件来检查它;例如:使用短路或 || KeyStore.key != nodeMap.key
【解决方案2】:

我能想到的最简单易读的方法是将您的NamedNodeMap 实例转换为实际的Map&lt;String, String&gt;,然后使用标准的Set.containsAll 方法执行您想要的检查:

private boolean checkForMatch(NamedNodeMap nodeMap, Map<String, String> keyStore) {

    // First create map from nodeMap
    Map<String, String> nodes = new HashMap<>();
    for (int i = 0; i < nodeMap.getLength(); i++) {
        Node node = nodeMap.item(i);
        nodes.put(node.getNodeName(), node.getNodeValue());
    }

    // Then check the condition
    return nodes.entrySet().containsAll(keyStore.entrySet());
}

您可以使用流在单行中做到这一点:

private boolean checkForMatch(NamedNodeMap nodeMap, Map<String, String> keyStore) {
    return IntStream.range(0, nodeMap.getLength())
        .mapToObj(nodeMap::item)
        .collect(Collectors.toMap(Node::getNodeName, Node::getNodeValue))
        .entrySet().containsAll(keyStore.entrySet());
}

两个 sn-ps 在功能上是等效的。

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2021-10-15
    • 2022-11-25
    • 2016-05-03
    • 2017-04-26
    相关资源
    最近更新 更多