当 for 循环中的所有条件都为真时,如何仅 return 为真?
How to only return true when all conditions in for loop are true?
- 我有一个 keyStore,它可以包含一个或多个键值对
- 我有一个 nodeMap 可以包含一个或多个键值对
- keyStore 中的所有键都必须存在于 nodeMap 中,keyStore 中的所有键值对必须在 nodeMap 中与 return 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
.
中
步骤:
- 检查 keyStore 大小是否大于 nodeMap 大小,如果是 return false
nodeMap 无法容纳所有 keyStore 的元素
- 检查 keyStore 中是否有任何元素与 nodeMap 不匹配 return false
- 除此之外 return 正确
这里有一个简单的方法:
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;
我能想到的最简单易读的方法是将您的 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());
}
两个片段在功能上是等同的。
- 我有一个 keyStore,它可以包含一个或多个键值对
- 我有一个 nodeMap 可以包含一个或多个键值对
- keyStore 中的所有键都必须存在于 nodeMap 中,keyStore 中的所有键值对必须在 nodeMap 中与 return 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
.
步骤:
- 检查 keyStore 大小是否大于 nodeMap 大小,如果是 return false nodeMap 无法容纳所有 keyStore 的元素
- 检查 keyStore 中是否有任何元素与 nodeMap 不匹配 return false
- 除此之外 return 正确
这里有一个简单的方法:
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;
我能想到的最简单易读的方法是将您的 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());
}
两个片段在功能上是等同的。