如何在for循环中的所有条件都为真时返回true?

时间:2017-10-29 21:30:00

标签: java for-loop boolean boolean-logic

  • 我有一个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只包含一个键值对,而第一个条件失败则循环中断,而不是继续。

2 个答案:

答案 0 :(得分:2)

我能想到的最简单易读的方法包括将您的NamedNodeMap实例转换为实际Map<String, String>,然后使用标准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());
}

两个片段在功能上都是等效的。

答案 1 :(得分: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;