【问题标题】:HashSet - How to searchHashSet - 如何搜索
【发布时间】:2018-01-08 20:34:57
【问题描述】:

我有一个 HashSet (a hashmap of (string and list of (hashmap of (two strings))))

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

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

上搜索 HashSet
  • StrA-->String1
  • StrB-->String2

它应该返回String 3和String 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");
}

【问题讨论】:

  • 你能分享你已经尝试过的代码吗?

标签: java hashmap hashset


【解决方案1】:

使用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);
            }
        }
    }
}

【讨论】:

  • 谢谢@azro。我用了foreach。当我的 HashSet 中的外部 HashMap 有 1000 多个时,此搜索性能的任何 cmets。
  • @ItsMeGokul 好的,如果没有找到,我已经更改了第一个以添加安全性
【解决方案2】:

除了迭代外部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();

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2013-08-27
    • 2018-06-21
    • 1970-01-01
    • 2012-01-02
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多