如何总结对象的数组列表记录

时间:2015-06-19 11:58:25

标签: java arraylist

请查看以下问题。

    //Bean Class
public class Test {

    private int value;
    private int com_id;

    /**
     * @return the value
     */
    public int getValue() {
        return value;
    }

    /**
     * @param value the value to set
     */
    public void setValue(int value) {
        this.value = value;
    }

    /**
     * @return the com_id
     */
    public int getCom_id() {
        return com_id;
    }

    /**
     * @param com_id the com_id to set
     */
    public void setCom_id(int com_id) {
        this.com_id = com_id;
    }

}

主类

public class Test2 {

    public static void main(String[] args) {
        Test bean1 = new Test();
        Test bean2 = new Test();
        Test bean3 = new Test();
        Test bean4 = new Test();
        Test bean5 = new Test();

        //bean1
        bean1.setCom_id(1);
        bean1.setValue(10);
        //bean2 
        bean2.setCom_id(2);
        bean2.setValue(50);
        //bean3
        bean3.setCom_id(1);
        bean3.setValue(30);
        //bean4 
        bean4.setCom_id(1);
        bean4.setValue(20);
        //bean5
        bean5.setCom_id(2);
        bean5.setValue(20);

        //Arraylist of Test object
        ArrayList<Test> alltest = new ArrayList<Test>();
        alltest.add(bean1);
        alltest.add(bean2);
        alltest.add(bean3);
        alltest.add(bean4);
        alltest.add(bean5);

    }

}

现在我想要ArrayList的所有值的总和,其com_id与follow相同 answer_list com_id = 1; val = 60(10 + 30 + 20) com_id = 2; val = 70(50 + 20)

2 个答案:

答案 0 :(得分:1)

您可以使用for循环以旧方式执行此操作,或使用Java 8 Streams在一行(非常长)行中执行此操作:

List<Test> aggregated = 
    alltest.stream()
           .collect(Collectors.groupingBy(Test::getCom_id,
                                          Collectors.summingInt(Test::getValue)))
           .entrySet()
           .stream()
           .map(e-> new Test(e->getKey(),e->getValue())
           .collect(Collectors.toList());

说明:

第一部分(直到第一个collect的结尾)应该创建一个Map<Integer,Integer>,其中键是Test标识符,值是具有相同值的所有Test实例的值的总和标识。

第二部分迭代该Map的条目,然后转换为List of Test实例。

请注意,这需要使用两个参数向Test类添加构造函数。

public Test (int com_id, int value) {
    this.com_id = com_id;
    this.value = value;
}

这未经过测试,因此可能包含错别字。

答案 1 :(得分:0)

我完全同意,Ankur ......但这里至少有一些暗示:

你想要一些逻辑:

tempVar = 0
for all elements in my List:
    if the id of current element is what i need:
        add value of current element to tmpVar