【问题标题】:Extracting objects from a list by quantity [closed]按数量从列表中提取对象[关闭]
【发布时间】:2018-06-22 21:54:18
【问题描述】:

我有ArrayList<Drink> drinks Drink 类包含 2 个项目,nameamount

如果我在ArrayList<Drink 中填充了许多Drink 类的实例,例如:

“可乐”、“30”

“芬达”、“10”

“可乐”、“5”

“精灵”,“1”

“可乐”、“10”

我现在只希望有一个列表,它将这些元素和输出组合在一起,如下所示:

“可乐”、“45”

“芬达”、“10”

“精灵”,“1”

我怎样才能做到这一点。另外我不知道列表中会包含哪些饮料,可能是其他的。只是想按数量组合它们而不重复? 谢谢。

【问题讨论】:

  • “我怎样才能做到这一点?” => 通过编写代码。
  • 到目前为止你尝试了什么?
  • 你试过什么?你有什么问题?你得到什么错误信息?这不是代码编写服务。
  • 我正在尝试创建一个饮料的 HashSet,我将只拥有独特的饮料。然后让他们每个人都通过原始列表并计算数量。但是有没有更简单的方法?
  • Map<Drinks, Integer> 可能是您任务的首选集合。 Ђорђе, шта то радиш???

标签: java list arraylist


【解决方案1】:

如果您使用的是 java-8 或更高版本,那么

List<Drink> list = new ArrayList<>();
list.add(new Drink("coke", 30));
list.add(new Drink("fanta", 10));
list.add(new Drink("coke", 5));
list.add(new Drink("sprite", 1));
list.add(new Drink("coke", 10));
Map<String, Integer> map = list.stream()
    .collect(Collectors.groupingBy(Drink::getName, 
                 Collectors.summingInt(Drink::getAmount)));
System.out.println(map);

输出
{精灵=1,可乐=45,芬达=10}

Collection<Drink> c = 
       list.stream().collect(Collectors.groupingBy(Drink::getName,
            Collectors.collectingAndThen(
                Collectors.reducing((Drink a, Drink b) -> {
                   a.setAmount(a.getAmount() + b.getAmount());
                   return a;
            }), Optional::get))).values();

【讨论】:

  • 谢谢,有没有办法将地图转换回列表?列出
  • 编辑代码以获取集合类型
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多