2015-08-13 2 views
1

Я пытаюсь удалить повторяющиеся объекты из ArrayList и суммировать значения определенного поля. Например:Удаление повторяющихся объектов и значений полей суммирования

Если у меня есть ArrayList объекта «Оборудование»:

{[Name: Ram, Quantity: 2], 
[Name: Keyboard, Quantity: 3], 
[Name: Mouse, Quantity: 5], 
[Name: Keyboard, Quantity 5]} 

Я хочу, чтобы написать функцию, которая будет найти дубликат и просуммировать величины. В этом случае клавиатура является дубликатом поэтому окончательный ArrayList должен выглядеть следующим образом:

{[Name: Ram, Quantity: 2], 
[Name: Keyboard, Quantity: 8], 
[Name: Mouse, Quantity: 5]}. 

Я сделал попытку на него, и это, кажется, работает иногда, но иногда он пропускает элементы.

List<Hardware> myList = new ArrayList<Hardware>(); 
    myList.add(new Hardware("Ram", 2); 
    myList.add(new Hardware("Keyboard", 3); 
    myList.add(new Hardware("Mouse", 5); 
    myList.add(new Hardware("Keyboard", 5); 

    for(int i = 0; i < list.size(); i++){ 
     Hardware current = list.get(i); 
     for(int j = 1; j < list.size(); j++){ 
      Hardware compare = list.get(j); 
      if(current.getName().equals(compare.getName)){ 
       current.setQuantity(current.getQuantity() 
            + compare.getQuantity()) 
       list.remove(compare); 
      } 
     } 
    } 

ответ

5
  • Вы не хотите, чтобы увеличить j, если вы удалили пункт; это заставит вас пропустить следующий пункт.
  • Вы не хотите запускать второй цикл в 1, вы хотите начать его с i+1, потому что вам не нужно проверять какие-либо из предыдущих элементов.
  • Ваш пример имеет несколько синтаксических ошибок, вы меняете myList к list и re `отсутствуют некоторые круглые скобки и точка с запятой

Попробуйте вместо этого:

List<Hardware> list = new ArrayList<Hardware>(); 
list.add(new Hardware("Ram", 2)); 
list.add(new Hardware("Keyboard", 3)); 
list.add(new Hardware("Mouse", 5)); 
list.add(new Hardware("Keyboard", 5)); 
list.add(new Hardware("Mouse", 1)); 

for (int i = 0; i < list.size(); i++) { 
    Hardware current = list.get(i); 
    for (int j = i + 1; j < list.size(); j++) { 
    Hardware compare = list.get(j); 
    if (current.getName().equals(compare.getName())) { 
     current.setQuantity(current.getQuantity() + compare.getQuantity()); 
     list.remove(compare); 
     j--; 
    } 
    } 
} 

Вы должны также проверить эту ссылку, чтобы помочь вам в решении следующих проблем:

2

Имейте в виду, что вы написали O (N * N) АЛГОРИТМ Он отлично работает только тогда, когда list.size() мала. Вы можете получить O (n) производительность здесь:

Map<String, Hardware> hardwareMap = new HashMap<>(); 
for(Hardware h : myList){ 
    Hardware current = hardwareMap.get(h.getName()); 
    if(current == null){ 
     hardwareMap.put(h.getName(), h); 
    }else{ 
     current.setQuantity(current.getQuantity() + h.getQuantity()); 
    } 
} 
Collection<Hardware> list = hardwareMap.values(); 
Смежные вопросы