提问者:小点点

如何遍历Map<Object, Long>列表


我想从这个列表中获取值:

List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();

我从列表中打印值,如下所示:

for (Map<CategoryModel, Long> categoryModelLongMap : list) {
    System.out.println(categoryModelLongMap.values());
}

输出:

[computers, 0]
[mouses, 0]
[keyboards, 0]
[laptops, 0]

但是现在我想将这些值添加到另一个映射中,就像它们出现在上面一样。我写了一些类似的东西,但是它不起作用

    Map<String, String> newMap = new HashMap<>();

    for (Map<CategoryModel, Long> featureService : list) {
        for (Map.Entry<CategoryModel,Long> entry : featureService.entrySet()) {
            newMap.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
        }
    }

输出:

{number=0, category_name=laptops}

地图


共2个答案

匿名用户

一种方法是使用这样的东西:

而不是

    Map<String, String> newMap = new HashMap<>();

for (Map<CategoryModel, Long> featureService : list) {
    for (Map.Entry<CategoryModel,Long> entry : featureService.entrySet()) {
        newMap.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
    }
}

使用

    Map<String, String> newMap = new HashMap<>();
                    
                        for (Map<CategoryModel, Long> featureService : list) {
                            for (Map.Entry<CategoryModel,Long> entry : featureService.entrySet()) {
                    String rawKeyReturn = String.valueOf(entry.getKey());            
                    String rawValueReturn = String.valueOf(entry.getValue());   
                newMap.put(
        rawKeyReturn.substring(rawKeyReturn.indexOf("=")+1,rawKeyReturn.length()), 
                
rawValueReturn.substring(rawValueReturn.indexOf("=")+1,rawValueReturn.length())
                );
         }           
  }

抱歉的格式,我不知道如何修复代码块中的行间距。

此解决方案的工作原理是仅创建调用value eOf()方法的结果的子字符串并切断标签(包括第一个=符号在内的所有内容)。

可能有更优雅的方法来做到这一点,但我不确定如何做到。

匿名用户

您需要将列表中每个地图的条目展平。

然后将与每个不同的分类模型关联的数据分组,并将映射到同一键的值相加。

基本上,这可以使用两个嵌套循环来完成(您的尝试很接近)。

如何实现它可以使用Java8方法Map. merge()

List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
    
Map<String, Long> result = new HashMap<>();

for (Map<CategoryModel, Long> categoryModelLongMap : list) {
    for (Map.Entry<CategoryModel, Long> entry : categoryModelLongMap.entrySet()) {
        result.merge(entry.getKey().getCategoryName(),
                     entry.getValue(),
                     Long::sum);
    }
}

或者,可以使用StreamAPI。

您可以在列表上生成流。使用plattMap()操作展平每个Map的条目,然后应用收集()

CollectorgroupingBy()将对具有相同类别的条目进行分组,下游收集器summingLong()将聚合与相同键关联的值。

List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
    
Map<String, Long> result = list.stream()
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.groupingBy(
        entry -> entry.getKey().getCategoryName(),
        Collectors.summingLong(Map.Entry::getValue)
    ));

同样,您可以使用CollectortoMap()的三参数版本:

List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
    
Map<String, Long> result = list.stream()
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.toMap(
        entry -> entry.getKey().getCategoryName(),
        Map.Entry::getValue,
        Long::sum
    ));

相关问题