Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除重复对象并求和字段值_Java_Loops_Arraylist_Iteration - Fatal编程技术网

Java 删除重复对象并求和字段值

Java 删除重复对象并求和字段值,java,loops,arraylist,iteration,Java,Loops,Arraylist,Iteration,我试图从ArrayList中删除重复的对象,并对某个字段的值求和。例如: 如果我有对象“硬件”的ArrayList: {[名称:Ram,数量:2], [名称:键盘,数量:3], [名称:鼠标,数量:5], [名称:键盘,数量5]} 我想写一个函数,它将找到一个重复项并求和数量。在这种情况下,键盘是重复的,因此最后的ArrayList应该如下所示: {[名称:Ram,数量:2], [名称:键盘,数量:8], [名称:鼠标,数量:5]}。 我已经尝试过了,它有时似乎有效,但有时却忽略了元素

我试图从
ArrayList
中删除重复的对象,并对某个字段的值求和。例如:

如果我有对象“硬件”的
ArrayList

{[名称:Ram,数量:2],
[名称:键盘,数量:3],
[名称:鼠标,数量:5],
[名称:键盘,数量5]}
我想写一个函数,它将找到一个重复项并求和数量。在这种情况下,键盘是重复的,因此最后的
ArrayList
应该如下所示:

{[名称:Ram,数量:2],
[名称:键盘,数量:8],
[名称:鼠标,数量: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);
             }
         }
    }
List myList=new ArrayList();
添加(新硬件(“Ram”,2);
添加(新硬件(“键盘”,3);
添加(新硬件(“鼠标”,5);
添加(新硬件(“键盘”,5);
对于(int i=0;i
  • 如果删除了项目,则不希望增加
    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--;
    }
  }
}
List List=new ArrayList();
添加(新硬件(“Ram”,2));
添加(新硬件(“键盘”,3));
添加(新硬件(“鼠标”,5));
添加(新硬件(“键盘”,5));
添加(新硬件(“鼠标”,1));
对于(int i=0;i

您还应查看此链接,以帮助您解决类似以下问题:

      • 如果删除了项目,则不希望增加
        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--;
          }
        }
      }
      
      List List=new ArrayList();
      添加(新硬件(“Ram”,2));
      添加(新硬件(“键盘”,3));
      添加(新硬件(“鼠标”,5));
      添加(新硬件(“键盘”,5));
      添加(新硬件(“鼠标”,1));
      对于(int i=0;i

      您还应查看此链接,以帮助您解决类似以下问题:

      请注意,您编写了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();
      
      Map hardwareMap=newhashmap();
      用于(硬件h:myList){
      硬件当前=hardwareMap.get(h.getName());
      如果(当前==null){
      硬件映射put(h.getName(),h);
      }否则{
      current.setQuantity(current.getQuantity()+h.getQuantity());
      }
      }
      集合列表=硬件映射.values();
      
      请注意,您编写了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();
      
      Map hardwareMap=newhashmap();
      用于(硬件h:myList){
      硬件当前=hardwareMap.get(h.getName());
      如果(当前==null){
      硬件映射put(h.getName(),h);
      }否则{
      current.setQuantity(current.getQuantity()+h.getQuantity());
      }
      }
      集合列表=硬件映射.values();