我有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 为 keyword
和List<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/