[英]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.