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

时间:2016-06-20 11:25:46

标签: java

我有一个ArrayList<项目>,我想做一个功能,用相同的代码汇总所有项目的数量,然后显示所有数量的项目。

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

    public Item(String InputCode, int InputQuantity)
    {
        this.code= InputCode;
        this.quantity = InputQuantity;
    }
}

假设我执行以下操作

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();

然后所需的输出是

A01 4
A02 3
B05 2
Z02 2

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

7 个答案:

答案 0 :(得分:10)

您可以使用流来执行此操作:

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

...

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

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

public class Item {
    ...
    public String getCode() {...}
    public int getQuantity() {...}
}

这会将商品代码A01A02等映射到各自的数量总和。

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

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

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

答案 1 :(得分:1)

创建一个地图,其中string是代码,int是数量。如果是,则如果map包含键,则迭代项目列表检查,添加数量,否则添加新的键值对。

Map<String, Integer> map = new Hashmap<String, Integer>();
for(Item item : items){
    if(map.containsKey(item.code)){
        int q = map.get(item.code) + item.quantity;
        map.put(item.code, q);
    } else {
        map.put(item.code, item.quantity);
    }
}

答案 2 :(得分:1)

以下是使用Java 8 Stream APITreeMap

的替代方法

默认情况下,TreeMap会根据可比较的自然顺序对其键进行排序。

必需的导入

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;       
import java.util.TreeMap;       

示例代码

Map<String, Integer> result = items.stream()
        .collect(groupingBy(Item::getCode, TreeMap::new, summingInt(Item::getQtd)));

result.forEach((k, v) -> System.out.println(k + " " + v));

输出

A01 4
A02 3
B05 2
Z02 2

答案 3 :(得分:0)

您可以尝试这样的事情

  1. 创建Map<String,Integer> countMap = new HashMap<>();
  2. 迭代列表,并将代码Key添加为地图,数量为Value
  3. 例如:

    Map<String,Integer> countMap = new HashMap<>()
    for(Item item: items){
       Integer count=countMap.get(item.getCode())
       // if null then add quantity and code
       // eg: countMap.put(item.getCode(),item.getQuantity())
       // if not null countMap.put(item.getCode(),count+item.getQuantity()
    
    }
    

答案 4 :(得分:0)

检查流框架和esp。 Collectors类中的示例。 &#34;按部门计算工资总额&#34;可以很容易地解决你的问题。

答案 5 :(得分:0)

        Map<String, Integer> maps = new HashMap<String, Integer>();
        Item item;
        for (int i = 0; i < items.size(); i++) {
            item = items.get(i);
            maps.put(item.getCode(), maps.containsKey(item.getCode()) ? item.getQuantity()+ + maps.get(item.getCode()) : item.getQuantity());   
        }
        item = null;

//项目类

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

    public Item(String InputCode, int InputQuantity)
    {
        this.code= InputCode;
        this.quantity = InputQuantity;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

}

答案 6 :(得分:0)

只是来自java6中myside的解决方案。我在你的Item类中添加了getter和setter,并在itemcode的基础上实现了可比性。

希望它可以帮助你。

修改后的物品类。

public class Item implements Comparable<Item> {
    private String code;
    private int quantity;

    public Item(String InputCode, int InputQuantity) {
        this.code = InputCode;
        this.quantity = InputQuantity;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public int compareTo(Item o) {
        // TODO Auto-generated method stub
        return this.getCode().compareTo(o.getCode());
    }

}

获得所需列表的方法:

List<Item> getDesiredList(List<Item> itemList) {
        List<Item> tempList = new ArrayList<Item>();
        // sort list to maintain order
        Collections.sort(itemList);
        String itemCode = null;
        int quantity = 0;
        Item itemObj = null;
        for (int i = 0; i < itemList.size(); i++) {
            if (itemCode == null || itemCode.equals(itemList.get(i).getCode())) {
                quantity = quantity + itemList.get(i).getQuantity();
            } else {
                itemObj = new Item(itemCode, quantity);
                if (tempList.contains(itemObj)) {
                    tempList.remove(itemObj);
                }
                tempList.add(itemObj);
                quantity = 0;
                quantity = quantity + itemList.get(i).getQuantity();
            }

            itemCode = itemList.get(i).getCode();

            if (i == itemList.size() - 1) {
                itemObj = new Item(itemCode, quantity);
                tempList.add(itemObj);
            }
        }

        return tempList;
    }

希望它可以帮到你。