"Duplicate" 个 ArrayList 中的条目?

"Duplicate" entries in ArrayList?

我有这个 class 这将填充一个列表,其中包含预先在数组中制作的所有员工。我可以用员工填充 ArrayList 但唯一的问题是我得到一些 "Duplicate" 条目,我使用引号因为它们不完全相同但它们可以共享相同的名称或员工编号但可能不相同雇用年份或薪水等。

这里是员工 class :

public class Employee {

public String EmployeeName;
public String EmployeeNumber;
public int hireyear;
public double WeeklyEarning;

public Employee()
{
    EmployeeName = null;
    EmployeeNumber = null;
    hireyear = 0;
    WeeklyEarning = 0;

}

public static final String[] Empnum = new String[] {
        "0001-A", "0002-B","0003-C","0004-D","0002-A",
        "0003-B","0004-C","0005-D","0011-A", "0012-B",
        "0013-C","0014-D","0121-A", "0122-B","0123-C",
        "0321-A", "0312-B","1234-D","4321-C","1122-D"};

public static final String[] Ename = new String[] {
        "Josh", "Alex", "Paul", "Jimmy", "Josh", "Gordan", "Neil", "Bob",
        "Shiv", "James", "Jay", "Chris", "Michael", "Andrew", "Stuart",
        "Dave","Benjamin","Dan","Brian","Michelle"};

public String getEmployeeName()
{
    return this.EmployeeName;
}

public String getEmployeeNumber()
{
    return this.EmployeeNumber;
}

public int gethireyear()
{
    return this.hireyear;
}

public double getWeeklyEarning()
{
    return this.WeeklyEarning;
}

public String setEmployeeName(String EName)
{
    return this.EmployeeName = EName;
}

public String setEmployeeNumber(String ENumber)
{
    return this.EmployeeNumber = ENumber;
}

public int setEmployeehireyear(int Ehireyear)
{
    return this.hireyear = Ehireyear;
}

public double setEmployeeweeklyearning(double Eweeklyearning)
{
    return this.WeeklyEarning = Eweeklyearning;
}

public String toString(){
    String data = "\n Employee Name : " + EmployeeName + " \n Employee Number: " + EmployeeNumber + " \n Hire Year : " + hireyear + "\n Weekly Earnings : " + WeeklyEarning;
    return data;
}

public boolean equals(Object o){
    if(this == null){
        return false;
    }
    if(this == o){
        return true;
    }
    if(!(o instanceof Employee)){
        return false;
    }

    Employee temp = (Employee) o;
    if(this.getEmployeeName().equals(temp.getEmployeeName())){
        return true;

    }
    if(this.getEmployeeNumber().equals(temp.getEmployeeNumber())){
        return true;

    }
    if(this.gethireyear() == temp.gethireyear()){
        return true;
    }
    if(this.getWeeklyEarning() == temp.getWeeklyEarning()){
        return true;
    }
    return false;

}

}

这是将填充列表的 generateList 方法:

public ArrayList<Employee> generateEmpList(){
    empList = new ArrayList <Employee>();
    Random empPicker = new Random();

    for(int i = 0; i < 20; i++){
        int id = empPicker.nextInt(20);
        if(id < 12) // roll for production worker
        {

            //System.out.println("Adding Production Worker");
            ProductionWorker temp = new ProductionWorker();
            temp = temp.generateProductionWorker();
            prodWorker = temp;
            empList.add(prodWorker);

        }
        else //roll for Shift supervisor
        {
            //System.out.println("Adding Shift supervisor");
            ShiftSupervisor supervisor = new ShiftSupervisor();
            supervisor = supervisor.generateShiftSupervisor();
            shiftWorker = supervisor;
            empList.add(shiftWorker);
        }
    }
    Iterator iterator = empList.iterator();
    while (iterator.hasNext()) {
        System.out.println("");
        System.out.println(iterator.next());

    }
    return empList;
}

"generateProductionWorker()" 和 shiftSupervisor 方法也可能有帮助 - 只是为了保持简短 post prod worker 方法因为它们基本相同:

public ProductionWorker generateProductionWorker(){
    Random rng = new Random();
    int numberOfEmployeeNames = Ename.length;
    ProductionWorker tempPworker = new ProductionWorker();

    String employeeName = Ename[rng.nextInt(numberOfEmployeeNames)];
    tempPworker.setEmployeeName(employeeName);

    int numberOfEmployeeNumbers = Empnum.length;
    String employeeNumber = Empnum[rng.nextInt(numberOfEmployeeNumbers)];
    tempPworker.setEmployeeNumber(employeeNumber);

    int yearHired = rng.nextInt(35) + 1980;
    tempPworker.setEmployeehireyear(yearHired);

    double weeklySalary = rng.nextInt((100) * 100);
    tempPworker.setEmployeeweeklyearning(weeklySalary);

    int hourlyRate = rng.nextInt(20) + 10;
    tempPworker.setHourlyRate(hourlyRate);

    return tempPworker;

}

我确信我遗漏了一些微不足道的东西,但是有什么想法为什么当我有一个包含 20 个名字和数字的列表时我会得到类似的条目?

例如: 员工姓名 - 乔希 empnum - 0000-A 雇佣年 - 1994 工资 - 40,000

员工姓名 - 乔希 empnum - 0000-A 雇佣年 - 1999 工资 - 60,500

任何建议都会有所帮助,谢谢!

查看 Employee class 中的 equals 方法。如果他们的名字相同,你 return 为真,这意味着他们是平等的。其他属性也是如此。您必须替换您的 if 语句。

我同意 Georgi 的观点,你的 equals 方法是罪魁祸首。

目前它在

行的第一个 if 语句之后返回 true
if(this.getEmployeeName().equals(temp.getEmployeeName())){
    return true;
}

因为它是一个 return 语句,所以它会阻止该方法继续执行其他语句。你可以试试这个:

    public boolean equals(Object o){
        if(this == null){
            return false;
        }
        if(this == o){
            return true;
        }
        if(!(o instanceof Employee)){
           return false;
        }
        //set all the elements in the array to false and change to true when true.
        boolean [] doesItMatch = new boolean[4];
        doesItMatch[0] = false;
        doesItMatch[1] = false;
        doesItMatch[2] = false;
        doesItMatch[3] = false;

        Employee temp = (Employee) o;
        if(this.getEmployeeName().equals(temp.getEmployeeName())){
            doesItMatch[0] = true;
        }
        if(this.getEmployeeNumber().equals(temp.getEmployeeNumber())){
            doesItMatch[1] = true;
        }
        if(this.gethireyear() == temp.gethireyear()){
            doesItMatch[2] = true;
        }
        if(this.getWeeklyEarning() == temp.getWeeklyEarning()){
            doesItMatch[3] = true;
        }
        int check = 0;
        //Now that you have checked all the values, check the array. Using a simple counter. 
        for(int i = 0; i < doesItMatch.length; i++){
            if(doesItMatch[i]){
                check++;
            } else {
                check--;
            }
        }
        //The counter should be 4 when the if statements above are all true. Anything else is false.
        if(check == 4){
            return true;
        } else {
            return false;
        }
    }

此方法现在检查 Employee class 中的每个属性。 (姓名、编号、雇用年份等。如果您为 class 创建更多属性,则很容易向数组添加更多元素,只需确保将它们设置为 false。) 希望这可以帮助 如果您扩展 Employee class,这也需要一些维护,因此您可能想找到一种方法让自己更轻松一些。