我必须实施方法maxPricePerProductType
,该方法返回产品类型的出价的最高价格,产品按字母顺序排序。没有出价的产品不予考虑。该方法的原型是:
public SortedMap<String, Integer> maxPricePerProductType() { //use toMap
return null;
}
我的课程
public class GroupHandling {
private Map<String, Group> groups = new HashMap<>();
public SortedMap<String, Integer> maxPricePerProductType() { //use toMap
return null;
}
}
public class Group {
private String name;
String productType;
Map<String, Bid> bids = new HashMap<>();
public String getProductType() {
return productType;
}
}
public class Bid {
String name;
Group g;
int price;
public int getPrice() {
return price;
}
public String getProductType(){
return g.productType;
}
}
每个小组都有兴趣购买某种类型的产品,并在地图bids
注册了该组必须购买产品的选项。例如,Group G1
想购买智能手机,他们有3个出价:B1,B2和B3。 B1成本为10,B2 15和B3 7. G2也想购买智能手机。它有2个出价。 B4成本为5,B5成本为20.因此我必须采用B1,B2,B3,B4和B5(因为它们都是相同产品类型的出价)并将有序地图B5添加为关键值,将20添加为值。简而言之,我需要从每个组中获取出价,按产品类型对它们进行分组,并将价格最高的一个添加到已排序的地图中。
这就是我试图做的事情:
public SortedMap<String, Integer> maxPricePerProductType() { //use toMap
return groups.values().stream().
flatMap(g -> g.bids.values().stream())
.
;
}
但我不知道如何继续,或者这部分是否正确。
答案 0 :(得分:3)
这有点误导了private Map<String, Gruppo> groups = new HashMap<>();
和Map<String, Bid> bids = new HashMap<>();
所持有的内容。如果这些地图中的密钥是B1, B2...
和G1, G2...
- 实际名称,而不是真正需要它们 - 因为无论如何,这些信息都存在于每个地图中。所以这些应该是List
s。
如果还有其他内容,您可以使用:
SortedMap<String, Integer> result = groups
.values()
.stream()
.filter(g -> g.getBids() != null || !g.getBids().isEmpty())
.flatMap(g -> g.getBids().values().stream())
.collect(Collectors.groupingBy(b -> b.getGroup().getProductType(),
TreeMap::new,
Collectors.mapping(Bid::getPrice,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.naturalOrder()), Optional::get))));