我有一张我构建的地图。它遍历 XML 格式的巨大 WAPI 回复并创建此映射。对于每个名称,我想获取名称,然后是匹配的运营商对的总数,然后是该名称的最便宜价格。
因此,基于下面的结果将是:
AACATDOM: [AA/AA: 3, UA/AA: 1] 390.99
11PUB2: [ UA/AA: 1, AS/AS: 4] 486.99
myMap = [[name:AACATDOM, cost:390.99, carrierpair:AA/AA], [name:AACATDOM, cost:390.99, carrierpair:AA/AA], [name:AACATDOM, cost:395.99, carrierpair:UA/AA], [name:AACATDOM, cost:393.99, carrierpair:AA/AA], [name:AACATDOM, cost:393.99, carrierpair:AA/AA], [name:11PUB2, cost:486.99, carrierpair:UA/AA], [name:11PUB2, cost:486.99, carrierpair:UA/AA], [name:11PUB2, cost:892.99, carrierpair:AS/AS], [name:11PUB2, cost:892.99, carrierpair:AS/AS], [name:11PUB2, cost:892.99, carrierpair:AS/AS], [name:11PUB2, cost:892.99, carrierpair:AS/AS]]
这个有点难倒!提前感谢任何帮助!
这可能是使用 Groovy 的方法。
def list = [
[name:'AACATDOM', cost:390.99, carrierpair:'AA/AA'],
[name:'AACATDOM', cost:390.99, carrierpair:'AA/AA'],
[name:'AACATDOM', cost:395.99, carrierpair:'UA/AA'],
[name:'AACATDOM', cost:393.99, carrierpair:'AA/AA'],
[name:'AACATDOM', cost:393.99, carrierpair:'AA/AA'],
[name:'11PUB2', cost:486.99, carrierpair:'UA/AA'],
[name:'11PUB2', cost:486.99, carrierpair:'UA/AA'],
[name:'11PUB2', cost:892.99, carrierpair:'AS/AS'],
[name:'11PUB2', cost:892.99, carrierpair:'AS/AS'],
[name:'11PUB2', cost:892.99, carrierpair:'AS/AS'],
[name:'11PUB2', cost:892.99, carrierpair:'AS/AS']
]
list.groupBy ({ it.name }, { it.carrierpair }).collectEntries { key, value ->
[ key, value.collectEntries { k, v -> [ k, v.size() ] } ]
}.collectEntries { key, value ->
[ key, value << [ minCost: list.findResults { it.name == key ? it.cost : null }.min() ] ]
}
// results:
// [AACATDOM:[AA/AA:4, UA/AA:1, minCost:390.99], 11PUB2:[UA/AA:2, AS/AS:4, minCost:486.99]]
而不是Map使用Bag集合,通过调用getCount来节省计数
定义一个集合,该集合计算对象在集合中出现的次数。
在Java中,你可以使用Collectors.groupingBy(...)
来构建这样的map,它会产生一个数据结构,如
Map<String, List<Value>> map = listOfValues.stream()
.collect(Collectors.groupingBy(v -> v.getName());
其中,列表包含同一键的所有值。
@Sulteric 假设您的数据可以描述为
public class Data {
private String name;
private List<Map<String, Integer>> pairs;
private Double cost;
// getters and setters
public int getPairsCount () {
return pairs.size();
}
您将在类中对处理结果进行分组
public class ProcessedData {
private int pairsCount;
private Double cheapestCost;
public ProcessedData (int pairsCount,Double cheapestCost ) {
this.pairsCount = pairsCount;
this.cheapestCost = cheapestCost;
}
// getters and setters
您可以执行以下操作:
List<Data> data = new ArrayList<>();
// Fill the data
// Find the lowest cost for every name
Map<String, Double> minByName = data.stream().collect(Collectors.groupingBy(Data::getName, Collectors.minBy(Data::getCost)));
// Counts the pairs for every name and unites this data with min cost
Map<String, ProcessedData> result = data.stream().collect(Collectors.groupingBy(Data::getName, new ProcessedData(Collectors.summingInt(Data::getPairsCount), minByName.get(Data::getName))));
// Proceed with result