繁体   English   中英

比较 Java 中的集合内的集合

[英]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 只与Utensils中的设置进行比较

“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM