2015-09-25 4 views
-1

У меня есть список объектов (ObjectX), и я хочу суммировать вхождения этого поля (fieldX) от этого объекта для каждого элемента списка с тем же id (idX).Как использовать функцию SUM на объекте ArrayList

Пример folderList:

   idX  fieldX  fieldYY 
ObjectX1 :  1  50   a 
ObjectX2 :  1  null  a 
ObjectX3 :  1  30   a 
ObjectX4 :  2  99   b 

Я хочу получить:

   idX  fieldX  fieldYY 
ObjectX1 :  1  80   a 
ObjectX2 :  2  99   b 

Я начал сортировки списка перегруппировать объекты с тем же idX: (я использую Java 1.6)

Collections.sort(folderList, new Comparator<ObjectX>() 
{ 
    public int compare(final ObjectX objOne, final ObjectX objTwo) 
    { 
     Integer orderFirst = objOne.getOrders(); 
     Integer orderSecond = objTwo.getOrders(); 
     Integer dareOne = new Integer(0); 
     Integer dareTwo = new Integer(0); 
     int sComp = orderFirst.compareTo(orderSecond); 
     if (sComp != 0) { 
      return sComp; 
     } 
     else { 
      dareOne = objOne.getFolderNum(); 
      dareTwo = objTwo.getFolderNum(); 
      return dareOne.compareTo(dareTwo); 
     } 
    } 
}); 

Но я не понимаю, как я могу в то же время суммируйте значения fieldX и получите только одну строку на fieldX (как функция SUM() в SQL) эффективным образом.

+1

Что происходит с 'полемYY'? Или, если 'idX' то же самое,' fieldY' тоже то же самое? Возможно, вам понадобится «Карта» с 'idX' в качестве ключа. – Teepeemm

+0

Поле YY всегда будет одинаковым для всех вхождений данного idX. – redAce

ответ

1

В java8 вы можете сделать так:

Map<Integer,List<ObjectX>> map = folderList.stream().collect(Collectors.groupingBy(Folder::getId)); 

здесь ключ -is идентификатор и значение список объектов имеют одинаковый идентификатор

+2

Привет, сказал, что он использовал java6. ваше решение не будет работать. –

+0

Ya, извините, но не видно. спасибо за высказывание. – KishoreReddy

0

Это очень просто сделать, если вы выбираете правильную структуру данных для вашей задачи.

Например, у вас есть Map<ObjectX, ObjectXDescription> ObjectXDescription следует инкапсулировать idX, fieldX, fieldY.

Далее вы можете написать простой цикл, который будет проходить через все ваши сущности и сумма fieldX.

+0

Я искал карты, потому что мне нужно каждый раз возвращать список. Преобразование списка на карту, а затем в список не будет дорогостоящим? – redAce

+0

зависит от размера. –

+0

Конверсии будут равны O (n), что значительно упростит ваш код. Сортировка принимает O (n log n), и вы все еще не позаботились о суммировании. (И не беспокойтесь о том, сколько времени вам потребуется, пока вы не установили, что требуется очень долгое время.) – Teepeemm

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