簡體   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