计算键值在地图中出现多少次?(JAVA)

时间:2018-08-04 14:31:28

标签: java json jackson

我正在尝试计算键值在地图中出现的次数。我想做的是计数并返回重复名称出现的次数以及JSON数组中的性别并返回它。因此,下面的数据应返回:

女:2 男:2

以2为重复名称出现的次数。

到目前为止,我已经通过使用ObjectMappers和解析器将JSON数据从文件中读取到Java对象中。但不确定如何计算重复的名称并将其放入Gender变量中。我尝试使用一条语句来匹配字符串(map.get(i).get(“ fullName”)== Williams),但是它没有用。任何人都有任何想法或知道更好的方法来做到这一点。谢谢

我的代码:

        ObjectMapper mapper = new ObjectMapper();
        JSONParser parser = new JSONParser();

        JSONObject jsonobj = (JSONObject) parser.parse(new FileReader("data.json"));    
        JSONArray jsons = (JSONArray) jsonobj.get("Person");
        //Map<Integer, Map<String, String>> jsonmaps = new HashMap<Integer, Map<String, String>>();

        int i = 0;
        List<Map<String, String>> map = new ArrayList();
            for (Object j : jsons) {
                map.add(mapper.readValue(j.toString(), new TypeReference<Map<String, String>>() {}));
                i++;
            }
        // for testing purposes
        //System.out.println(map.get(1).get("fullName"));
        //System.out.println(map.get(1).get("age"));
        //System.out.println(map.get(1).get("Gender"));
        //System.out.println(map.get(1).get("adult"));
        //System.out.println(map.get(1).get("dob"));
}

JSON文件:

{
      "fullName": "Bob Wilkins",
      "age": 25,
      "gender": "male"
},
{
      "fullName": "Hannah Williams",
      "age": 49,
      "gender": "Female",
      "isAdult": true,
      "dob": 29/12/1968
},
{
      "fullName": "Charlie Smith",
      "age": 10,
      "gender": "Male",
      "isAdult": false,
      "dob": 21/05/2008
},
{
      "fullName": "Hannah Williams",
      "age": 31,
      "gender": "Female",
      "isAdult": true,
      "dob": 13/02/1987
},
{
      "fullName": "Charlie Smith",
      "age": 25,
      "gender": "Male",
      "isAdult": true,
      "dob": 08/08/1994
},
..... 

1 个答案:

答案 0 :(得分:0)

以下内容对class ReporterAPI(viewsets.ModelViewSet): queryset = Reporter.objects.all() serializer_class = ReporterSerializer进行分组,然后按gender对每个集合进行分组。结果是fullName,其中值被限制为大于1的值,然后相加。

Map<String, Long>

Map<String, Long> counts = map.stream() .collect(Collectors.groupingBy(m -> m.get("gender"))) .entrySet() .stream() .map(entry -> new SimpleEntry<>(entry.getKey(), entry.getValue().stream() .collect(Collectors.groupingBy(m -> m.get("fullName"), Collectors.counting())) .values().stream() .mapToLong(l -> l) .filter(value -> value > 1).sum())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 是问题中的测试数据时,结果为:

maps

因此可以在您的{Male=2, Female=2, male=0} 列表上运行。