检查 2D LinkedHashSet 是否包含特定字符串
Check if 2D LinkedHashSet contains a specific string
我正在尝试查找是否在我创建的 2D LinkedHashSet 中找到特定的字符串值。
下面是一些初始化 LinkedHashSet 的代码:
LinkedHashSet<LinkedHashSet<String>> block = new LinkedHashSet<LinkedHashSet<String>>();
我试过像这样使用 .contains,但它似乎是一个不正确的参数类型:
int N = Integer.parseInt(b1.readLine());
for(int i = 0; i<N; i++) {
String sorts [] = (b1.readLine()).split(" ");
if(block.stream().anyMatch(list->list.contains(sorts[0]))) {
//System.out.println("I entered");
for (Set<String> innerSet : block) {
for (String string : innerSet) {
if(string.equals(sorts[0])) {
innerSet.add(sorts[5]);
}
if(string.equals(sorts[5])) {
innerSet.add(sorts[0]);
}
}
}
}
else {
block.add(new LinkedHashSet<String>(Arrays.asList(sorts[0], sorts[5])));
}
您可以使用流。
填充您的哈希集。
Set<Set<String>> nestedSet = new LinkedHashSet<>();
LinkedHashSet<String> set1 =
new LinkedHashSet<>(Set.of("alpha", "beta", "gamma", "delta", "epsilon"));
LinkedHashSet<String> set2 =
new LinkedHashSet<>(Set.of("apples", "oranges", "pears", "grapes", "bananas"));
nestedSet.add(set2);
nestedSet.add(set1);
测试数据
Map<String, Boolean> testData = Map.of("alpha", true, "pears", true,
"papayas", false, "eta", false, "omega", false, "house", false);
运行它
testData.forEach((item, expectedResult)-> {
System.out.printf("Item = \"%s\", Expected return = %b, actual = %b%n",
item,expectedResult, exists(nestedSet, item));
});
public static boolean exists(Set<Set<String>> sets,
String target) {
return sets.stream().anyMatch(set->set.contains(target));
}
可以使用parallelSteam
使进程并发且快速-
block.parallelStream()
.filter(stringSet ->
stringSet.contains(input))
.collect(Collectors.toList()).size() > 0
上面的代码采用 block
(LinkedHashSet<LinkedHashSet<String>>
) 和 input
字符串。使用来自 fork join pool 的多个 thread 在不同的集合中查找输入字符串。最后,它收集所有包含输入 字符串的集合 并检查大小是否 大于 0 和 return 如果是大小写,否则为假。
编辑 1
better version
是这个-
block.parallelStream().anyMatch(strings -> strings.contains(input))
这效率更高,因为它只会等待第一次匹配并立即return为真。
anyMatch
javadoc -
* Returns whether any elements of this stream match the provided
* predicate. May not evaluate the predicate on all elements if not
* necessary for determining the result. If the stream is empty then
* {@code false} is returned and the predicate is not evaluated.
我正在尝试查找是否在我创建的 2D LinkedHashSet 中找到特定的字符串值。
下面是一些初始化 LinkedHashSet 的代码:
LinkedHashSet<LinkedHashSet<String>> block = new LinkedHashSet<LinkedHashSet<String>>();
我试过像这样使用 .contains,但它似乎是一个不正确的参数类型:
int N = Integer.parseInt(b1.readLine());
for(int i = 0; i<N; i++) {
String sorts [] = (b1.readLine()).split(" ");
if(block.stream().anyMatch(list->list.contains(sorts[0]))) {
//System.out.println("I entered");
for (Set<String> innerSet : block) {
for (String string : innerSet) {
if(string.equals(sorts[0])) {
innerSet.add(sorts[5]);
}
if(string.equals(sorts[5])) {
innerSet.add(sorts[0]);
}
}
}
}
else {
block.add(new LinkedHashSet<String>(Arrays.asList(sorts[0], sorts[5])));
}
您可以使用流。
填充您的哈希集。
Set<Set<String>> nestedSet = new LinkedHashSet<>();
LinkedHashSet<String> set1 =
new LinkedHashSet<>(Set.of("alpha", "beta", "gamma", "delta", "epsilon"));
LinkedHashSet<String> set2 =
new LinkedHashSet<>(Set.of("apples", "oranges", "pears", "grapes", "bananas"));
nestedSet.add(set2);
nestedSet.add(set1);
测试数据
Map<String, Boolean> testData = Map.of("alpha", true, "pears", true,
"papayas", false, "eta", false, "omega", false, "house", false);
运行它
testData.forEach((item, expectedResult)-> {
System.out.printf("Item = \"%s\", Expected return = %b, actual = %b%n",
item,expectedResult, exists(nestedSet, item));
});
public static boolean exists(Set<Set<String>> sets,
String target) {
return sets.stream().anyMatch(set->set.contains(target));
}
可以使用parallelSteam
使进程并发且快速-
block.parallelStream()
.filter(stringSet ->
stringSet.contains(input))
.collect(Collectors.toList()).size() > 0
上面的代码采用 block
(LinkedHashSet<LinkedHashSet<String>>
) 和 input
字符串。使用来自 fork join pool 的多个 thread 在不同的集合中查找输入字符串。最后,它收集所有包含输入 字符串的集合 并检查大小是否 大于 0 和 return 如果是大小写,否则为假。
编辑 1
better version
是这个-
block.parallelStream().anyMatch(strings -> strings.contains(input))
这效率更高,因为它只会等待第一次匹配并立即return为真。
anyMatch
javadoc -
* Returns whether any elements of this stream match the provided * predicate. May not evaluate the predicate on all elements if not * necessary for determining the result. If the stream is empty then * {@code false} is returned and the predicate is not evaluated.