有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中HashMap的ArrayList上的流GroupBy

我想在HashMap数据结构的arrayList上做一个“groupby”。因为我的数据不是固定的,所以我没有任何固定的类。 数据如下所示

[{"name":"laxman","state":"Karnataka","Mobile":9034782882}, 
{"name":"rahul","state":"Kerala","Mobile":9034782882}, 
{"name":"laxman","state":"karnataka","Mobile":9034782882}, 
{"name":"ram","state":"delhi","Mobile":9034782882}]

上面的键不是固定的,所以我不能为它设置类。 数据和公式将是动态的。但是现在,我通过这个例子来理解这个数据

现在,我想得到基于namestate的计数, 所以基本上我想按名称和状态分组,并想得到计数

我试图使用Stream.Collector,但无法实现我想要的


共 (2) 个答案

  1. # 1 楼答案

    您必须进行两次分组,一次是在键上,一次是在值上

    Map<String, Map<Object, Long>> map = listOfMap.stream().flatMap(a -> a.entrySet().stream())
                    .collect(Collectors.groupingBy(Map.Entry<String, String>::getKey,
                            Collectors.groupingBy(Map.Entry::getValue, Collectors.counting())));
    

    输出

    {mobile={9034782882=4}, name={rahul=1, laxman=2, ram=1}, state={Karnataka=2, delhi=1, Kerala=1}}
    
  2. # 2 楼答案

    您可以使用Collectors.groupingBy完成此操作,使用List作为返回的Map的键:

    Map<List<String>, Long> result = yourListOfMaps.stream()
        .collect(Collectors.groupingBy(
            m -> Arrays.asList(String.valueOf(m.get("name")), String.valueOf(m.get("state"))),
            Collectors.counting()));
    

    这很好,因为Java中List的所有实现都一致地实现了hashCodeequals,这是用作任何Map实现的键的每个类都必须实现的