如何基于某个字段从列表中删除重复的对象,但是在删除之前添加数量?

问题描述 投票:0回答:1

我有一个具有多个字段的汇编类。

我需要根据装配代码从装配对象列表中删除装配类的重复对象,但是在删除之前,我需要将装配数量添加到匹配的装配对象的数量中。

package com.company;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Assembly> assemblies = new ArrayList<>();

        assemblies.add(new Assembly("abc1", 3.0));
        assemblies.add(new Assembly("abc2", 6.0));
        assemblies.add(new Assembly("abc3", 8.4));
        assemblies.add(new Assembly("abc4", 9.0));
        assemblies.add(new Assembly("abc1", 4.2));
        assemblies.add(new Assembly("abc1", 6.3));

        System.out.println("List with duplicates: "+assemblies);

        HashSet<String> assmCode=new HashSet<>();
        assemblies.removeIf(e->!assmCode.add(e.getAssemblyCode())); //remove the last two abc1

        //but i need to add 4.2, 6.3 to 3.0 before removing
        System.out.println("List without duplicates: "+assemblies);
    }
}

class Assembly{
    private String assemblyCode;
    private double assemblyQty;
    //There will be more such fields

    public Assembly(String assemblyCode, double assemblyQty) {
        this.assemblyCode = assemblyCode;
        this.assemblyQty = assemblyQty;
    }

    public String getAssemblyCode() {
        return assemblyCode;
    }

    public void setAssemblyCode(String assemblyCode) {
        this.assemblyCode = assemblyCode;
    }

    public double getAssemblyQty() {
        return assemblyQty;
    }

    public void setAssemblyQty(double assemblyQty) {
        this.assemblyQty = assemblyQty;
    }

    @Override
    public String toString() {
        return "Assembly{" +
                "assemblyCode='" + assemblyCode + '\'' +
                ", assemblyQty=" + assemblyQty +
                '}';
    }
}

[请让我知道在删除重复的对象之前是否可以进行此类操作。我是Java的Collection API的新手,所以很抱歉提出问题解决方案是否简单的问题。

java collections
1个回答
0
投票

当前,您使用Set<String>“记住”已添加的值。将其更改为Set<Assembly>

然后您需要在equals中实现Assembly,以便在比较Set是否已存在该条目时,同时考虑codequantity

class Assembly {
  private String assemblyCode;
  private double assemblyQty;
  //the other stuff here
  @Override
  public boolean equals(Object o) {
    //error handling here
    Assembly a = (Assembly)o;
    return assemblyCode.equals(a.assemblyCode)
        && assemblyQty == a.assemblyQty;
  }
}

然后将设置用法更改为

HashSet<Assembly> assmCode=new HashSet<>();
assemblies.removeIf(e->!assmCode.add(e));
© www.soinside.com 2019 - 2024. All rights reserved.