【问题标题】:Removing duplicate objects and summing field values删除重复对象并对字段值求和
【发布时间】:2015-11-06 13:46:04
【问题描述】:

我正在尝试从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);
             }
         }
    }

【问题讨论】:

    标签: java loops arraylist iteration


    【解决方案1】:
    • 如果您已删除该项目,您不想增加j;它会导致您跳过紧随其后的项目。
    • 您不想从1 开始第二个循环,而是希望从i+1 开始,因为您不需要检查任何前面的元素。
    • 您的示例有一些语法错误,您将 myList 更改为 list 并且缺少一些括号和分号

    试试这个:

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

      【讨论】:

        猜你喜欢
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        相关资源
        最近更新 更多