代码之家  ›  专栏  ›  技术社区  ›  ItsMeGokul

HashSet-如何搜索

  •  2
  • ItsMeGokul  · 技术社区  · 7 年前

    我有一个HashSet of(一个hashmap of(字符串)和一个列表of(两个字符串的hashmap)))

    HashSet<HashMap<String1,List<HashMap<String2,HashMap<String3,String4>>>>>
    

    现在,我需要使用字符串输入(StrA和StrB)进行搜索,这应该可以搜索

    • 斯特拉-->字符串1
    • StrB-->字符串2

    它应该返回字符串3和字符串4的hashMap。

    这就是我所尝试的。

    HashSet<HashMap<String,List<HashMap<String,HashMap<String,String>>>>> ObjList;
    
    public void getElement(String strA, String strB) {
        if(ObjList.contains(strA) && ObjList.contains(strB))
            System.out.println("Yes");
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   azro    7 年前

    解决方案使用 Streams 将是:

    HashSet<HashMap<String, List<HashMap<String, HashMap<String, String>>>>> fooSet = //;
    String string1 = "string1";
    String string2 = "string2";
    HashMap<String, String> mapFound;
    
    
    mapFound = fooSet.stream()                       // iterate over HashSet
           .filter(map -> map.containsKey(string1))  // keep maps that contains string1
           .findFirst()                              // take first map that match
           .orElseGet(HashMap::new)                  // take it really (or create new Map)
           .getOrDefault(string1, new ArrayList<>()) // take the List associated as value,or new List if not exists
           .stream()                                 // iterate over the list
           .filter(map -> map.containsKey(string2))  // keep maps that contains string2
           .findFirst()                              // take first map that match
           .orElseGet(HashMap::new)                  // take it really (or create new Map)
           .getOrDefault(string2, new HashMap<>());  // take HashMap associated as value, or new Map if not found
    

    经典解决方案 for each 循环将是:

    HashMap<String, String> mapFound;
    
    for (HashMap<String, List<HashMap<String, HashMap<String, String>>>> map : fooSet) {
        if (map.containsKey(string1)) {
            List<HashMap<String, HashMap<String, String>>> list = map.get(string1);
            for(HashMap<String, HashMap<String, String>> map2 : list){
                if(map2.containsKey(string2)){
                    mapFound = map2.get(string2);
                }
            }
        }
    }
    
        2
  •  1
  •   Timothy Truckle Vincent Boutot    7 年前

    除了迭代两者之外,没有其他选择 Set 以及内部 List (未测试):

    HashSet<HashMap<String1,List<HashMap<String2,HashMap<String3,String4>>>>> outer = //...
    
    HashMap<String3,String4> result =
       outer.stream()
            .findFirst(map1-> map1.containsKey(string1))
            .get()
            .stream()
            .findFirst(map2-> map2.containsKey(string2))
            .get();