java - 使用流 : Java 8 按多个属性进行分组和排序

标签 java collections java-8 java-stream

我有MainEntity列表

public class MainEntity {
private String keyword;
private double cost;
private String company;
}

我有CompanyEntity

public class CompanyEntity {
    private double cost;
    private String company;
    }

我正在尝试将我的列表转换为 Map<String,List<CompanyEntity>>其中 key 为 keywordList<CompanyEntity>将计算所有成本的平均值并进行排序。我正在尝试在流和 Java 8 中执行此操作。

对于作为输入的特定关键字,我正在这样做。

List<MainEntity> entityList = keyWordMap.get(entity.getKeyword());
        entityList.add(entity);
        keyWordMap.put(entity.getKeyword(), entityList);

Map<String, Double> average = (keyWordMap.get(keyword)).stream()
            .collect(groupingBy(MainEntity::getCompany,
                    Collectors.averagingDouble(MainEntity::getCtr)));
    result.put(keyword, new ArrayList<>());

    for (Map.Entry<String, Double> entity : average.entrySet()) {
        result.get(keyword).add(new CompanyEntity(entity.getKey(), entity.getValue()));
    }

但我试图为所有关键字创建一个 map 。是否可能或再次迭代整个列表有意义? 目前keyowordMap类型为Map<String,MainEntity>我通过迭代 MainEntity 列表来完成此操作,但我想要Map<String,List<MainEntity>> .

最佳答案

首先,制作一个keyWordMap

Map<String, List<MainEntity>> keyWordMap = 
            mainEntityList
            .stream()
            .collect(Collectors.groupingBy(MainEntity::getKeyword));

然后迭代map,对于每个关键词,可以直接得到按平均值排序的CompanyEntity列表,并使用map()转换数据并收集为列出,然后放入结果

Map<String,List<CompanyEntity>> result = ....
for (Map.Entry<String, List<MainEntity> entry : keyWordMap.entrySet()) {
    List<CompanyEntity> list = entry.getValue().stream()
                .collect(groupingBy(MainEntity::getCompany,
                        Collectors.averagingDouble(MainEntity::getCtr)))
                .entrySet()
                .stream()
                .sorted(Comparator.comparing(e -> e.getValue()))
                .map(e -> new CompanyEntity(e.getKey(), e.getValue()))
                .collect(Collectors.toList());
    result.put(entry.getKey(), list);
}

或者您想一次性完成此操作

Map<String,List<CompanyEntity>> mapData = 
           mainEntityList
            .stream()
            .collect(Collectors.groupingBy(MainEntity::getKeyWord,
                     Collectors.groupingBy(MainEntity::getCtr,
                        Collectors.averagingDouble(MainEntity::getCtr))))
            .entrySet()
            .stream()
            .collect(Collectors.toMap(m -> m.getKey(),
                 m -> m.entrySet()
                       .stream()
                       .sorted(Comparator.comparing(e -> e.getValue()))
                       .map(e -> new CompanyEntity(e.getKey(), e.getValue()))
                       .collect(Collectors.toList())));

关于java - 使用流 : Java 8 按多个属性进行分组和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63423924/

相关文章:

java - 基于 Kotlin 的应用程序将在 Android P 上获得性能提升意味着什么

java - 将一组 InternetAddress 转换为一组 String

java - 从 java 到 scala 集合的隐式转换成本

java - 将可选<T>转换为流<T>

java - 我想将 computeIfPresent 和 putIfAbsent 都放到一个原子函数中

java - 在 MongoDB 中的文档上使用 forEach

java - 拦截来自 BlazeDS 的 Date 对象并调整时区差异

JAVA 正则表达式 :Make nested same values into single group

java - Twitter4j-异步Twitter : Associate the response in the TwitterListener with the initiating request

scala - 如何旋转(圆形移位)Scala 集合