这里的任务是练习Map和收藏。
我们有两个类,其属性在括号中
第一类:客户机(字符串名称、字符串姓氏、整数年龄、bigdecimal现金)
下面是主目录中随机客户端的列表
List<Client> clients = List.of(
new Client("Ola", "Chrzaszcz", 34, new BigDecimal("200")),
new Client("Ala", "Kowalsky", 24, new BigDecimal("4000")),
new Client("Olaf", "Chrzaszcz", 19, new BigDecimal("3999")),
new Client("Piotr", "Nowak", 21, new BigDecimal("2099")),
new Client("Ola", "Szwed", 45, new BigDecimal("3000"))
)
;
第二类:产品(字符串名称、枚举类别、bigdecimal价格)
List<Product> products = List.of(
new Product("Szynka", Category.A, new BigDecimal(29)),
new Product("Ser", Category.B, new BigDecimal(22)),
new Product("Chleb", Category.C, new BigDecimal(6)),
new Product("Maslo", Category.D, new BigDecimal(4)),
new Product("Kielbasa", Category.A, new BigDecimal(25)),
new Product("Jajka", Category.A, new BigDecimal(8)),
new Product("Szynka", Category.C, new BigDecimal(25))
);
根据这两个列表创建新Map(关键字:person,value:map<product,已售出产品的数量)
//s1 - new map creation
Map<Client, Map<Product,Integer>> customersWithTheirShopping = new HashMap<>();
//向Map添加值
customersWithTheirShopping.put(clients.get(0), Map.of(products.get(0),5));
customersWithTheirShopping.put(clients.get(1), Map.of(products.get(1),6));
customersWithTheirShopping.put(clients.get(2), Map.of(products.get(6),16));
customersWithTheirShopping.put(clients.get(3), Map.of(products.get(5),11));
customersWithTheirShopping.put(clients.get(4), Map.of(products.get(4),5));
customersWithTheirShopping.put(clients.get(4), Map.of(products.get(3),6));
customersWithTheirShopping.put(clients.get(2), Map.of(products.get(2),8));
customersWithTheirShopping.put(clients.get(4), Map.of(products.get(1),9));
目标->预期结果:使用stream创建方法,返回花费最高的客户(价格x数量)
问题:
怎么做?如何得到Map本身的价值?!
由于这是Map,并且密钥(客户机)是唯一的,所以我们不能期望在客户机类的示例中重复,对吗(使用此Map结构)?这意味着每个顾客只可以订购一次,对吗?
我所做的->当前行为:
公共客户端Withmostexpshopping(){
return quantitiesOfProductsBoughtByClient
.entrySet()
.stream()
.max(Comparator.comparing(p -> p.getValue().entrySet().stream().max(
Comparator.comparing(x -> x.getKey().getPrice().multiply(BigDecimal.valueOf(x.getValue()))))))
};
//顺便说一句,不幸的是没有发现类似的情况
1条答案
按热度按时间8xiog9wr1#
是的,当前在您的代码中创建乘积和整数的不可变Map,因此您不能为客户机添加新产品。此外,还可以覆盖客户机的Map项,例如,索引为4的客户机具有
Map.of(products.get(1),9)
作为值,因为它是最后一个并覆盖以前的所有赋值如果希望每个客户机有多个产品,可以重构为:
然后可以使用流来获得正确的客户机
另一个解决方案是将quantity和product重构为一个新的类,称为boughtproduct或类似的类,在这个类中您可以计算出它的价格
然后可以使用列表而不是Map:
使流的可读性更强: