2015-06-19 3 views
-1

, пожалуйста, рассмотрите следующую проблему.Как суммировать запись массива-объекта объекта

//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 такое же, как следовать answer_list com_id = 1; val = 60 (10 + 30 + 20) com_id = 2; вал = 70 (50 + 20)

+0

То, что называется логическое здание, и вы должны знать, что по своему усмотрению .. напишите что-то, и даже тогда, если вы застряли где-нибудь, покажите нам код, в котором вы застряли, вместо того, чтобы напрямую обращаться к решениям! –

+0

Это моя проблема, но я не прошу прямого решения. но я пытался разными способами, и я не преуспел, поэтому я спрашиваю. – kandarp

+0

Тогда, по крайней мере, покажите, что вы пробовали .. в противном случае есть много способов сделать это, и как можно быть уверенным, что вы понимаете, в каком направлении. –

ответ

1

Вы можете сделать это по-старому с для петель, или сделать это в одной (очень долго) линии с использованием Java 8 потоков:

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.

Примечание. Для этого требуется добавить конструктор к классу Test с двумя параметрами.

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

Это не проверено, поэтому оно может содержать опечатки.

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 
+0

ОК спасибо за вашу поддержку, я обойдусь сам. – kandarp

Смежные вопросы