计算映射中重复键值的数量

  • 本文关键字:键值 映射 计算 java groovy
  • 更新时间 :
  • 英文 :


我有一张我构建的地图。它遍历 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

最新更新