[英]Compare Sets inside Sets in Java
有没有办法动态比较嵌套集的值? 例如
"Kitchen": {
"Utensils": [
"Pan",
"Spoon",
"Plate",
"Cup"
],
"Appliance": [
"Stove",
"Microwave",
"Oven"
],
"ABC": [
"a",
"b",
"c"
],
"DEF": [
"x",
"y",
"z"
],
.
.
.
}
这样
“Pan”与“Stove”不匹配
“锅”配“勺”
我有一种比较它的方法,但它不是动态的,它只比较像器具和电器这样的集合。 例如:如果我想比较 2 个地名:placeName0、placeName1
Map<String, Set<String>> kitchenMap = synonymsMap.get("Kitchen");
Set<String> utensils = kitchenMap.get("Utensils");
Set<String> appliance = kitchenMap.get("Appliance");
if (nameContainsSynonym(utensils, placeName0) && nameContainsSynonym(utensils, placeName1)){
return true;
}
public static boolean nameContainsSynonym(Set<String> synonymList, String placeName) {
boolean containsFlag = false;
for (String synonym : synonymList) {
if (synonym.trim().split("\\s+").length > 1) {
if (placeName.toUpperCase().contains(synonym)) {
containsFlag = true;
}
} else {
containsFlag = Arrays.asList(placeName.toUpperCase().split("\\s")).contains(synonym);
}
if (containsFlag) {
break;
}
}
return containsFlag;
}
您将每个 Set 存储在HashMap
中。 对于每个test
,您创建一个Element
,其中包含测试的名称和与测试匹配的可能家庭列表。
import java.util.*;
import java.util.stream.Collectors;
class Element {
String name;
List<String> families;
public Element(String name, List<String> families) {
this.name = name;
this.families = families;
}
@Override
public String toString() {
return new StringBuilder(name).append(": {").append(families.stream().collect(Collectors.joining(","))).append("}").toString();
}
}
public class Main {
public static void main(String[] args) {
HashMap<String, Set<String>> kitchen = new HashMap<>();
kitchen.put("Utensils", Arrays.asList("Pan", "Spoon", "Plate", "Cup").stream().collect(Collectors.toSet()));
kitchen.put("Appliance", Arrays.asList("Microwave", "Oven", "Stove").stream().collect(Collectors.toSet()));
List<String> tests = Arrays.asList("Pan", "Oven", "Cat");
List<Element> result = tests.stream().map(test ->
new Element(
test, // Name
kitchen.entrySet().stream().map(entry -> entry.getValue().contains(test) ? entry.getKey() : null).filter(Objects::nonNull).collect(Collectors.toList()) // Families
)
).collect(Collectors.toList());
result.forEach(System.out::println);
/* > Pan: {Utensils}
> Oven: {Appliance}
> Cat: {} */
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.