如何在Java中的ArrayList中总结具有相同属性的所有元素?

Wai*_*ung 0 java

我有一个ArrayList <Item>,我想做一个函数,用相同的代码汇总所有项目的数量,然后显示所有具有数量的项目.

public class Item{
    private String code;
    private int quantity;

    public Item(String InputCode, int InputQuantity)
    {
        this.code= InputCode;
        this.quantity = InputQuantity;
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我做了以下事情

List<Item> items = new ArrayList<Item>();
items.add(new Item("A01", 1));
items.add(new Item("A02", 1));
items.add(new Item("B05", 2));
items.add(new Item("A01", 3));
items.add(new Item("Z02", 2));
items.add(new Item("A02", 2));
display();
Run Code Online (Sandbox Code Playgroud)

那么期望的输出是

A01 4
A02 3
B05 2
Z02 2
Run Code Online (Sandbox Code Playgroud)

我不知道,有人能给我一些提示吗?

Jor*_*nee 10

你可以用流做到这一点:

import static java.util.stream.Collectors.*;

...

Map<String, Integer> map = items.stream()
                               .collect(groupingBy(Item::getCode,
                                   summingInt(Item::getQuantity)));
Run Code Online (Sandbox Code Playgroud)

假设你的班级有这些吸气剂:

public class Item {
    ...
    public String getCode() {...}
    public int getQuantity() {...}
}
Run Code Online (Sandbox Code Playgroud)

这将把项目代码,A01,A02等,它们的数量各自的总和.


您可以使用以下代码获取按代码排序的输出:

map.entrySet().stream()
    .sorted(Map.Entry.comparingByKey())
    .forEachOrdered((e) -> System.out.println(e.getKey() + " " + e.getValue()));
Run Code Online (Sandbox Code Playgroud)

注意:使用.forEachOrdered(System.out::println)相反,产生类似的输出A01=4,这与您给出的示例几乎相同,并且比上面的更简单.