当前位置: 首页 > 知识库问答 >
问题:

ArrayList中的“重复”条目?

丰赞
2023-03-14

我有一个类,它将用一个数组中预先生成的所有员工填写一个列表。我可以用员工填充ArrayList,但唯一的问题是,我得到了一些“重复”条目,我使用引号是因为它们不完全相同,但它们可以共享相同的姓名或员工编号,但可能不具有相同的雇用年份或薪资等。

员工类别如下:

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方法也可能很有帮助-简而言之,只有后期生产工人方法,因为它们基本相同:

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个名字和数字的列表,你知道为什么我会得到类似的条目吗?

例如:empname-josh empnum-0000-A雇佣工-1994年工资-40000

empname-josh empnum-0000-A hireyear-1999年工资-60500

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

共有2个答案

蒋波光
2023-03-14

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

目前,它在读取的行的第一个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;
        }
    }

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

万俟心思
2023-03-14

查看您的员工类中的equals方法。如果它们的名称相同,则返回true,这意味着它们是相等的。其他属性也是如此。您必须替换您的if语句。

 类似资料:
  • 问题内容: 说我像这样创建一些对象类 现在,我想创建一个arraylist来容纳许多这样的对象类。 我想包含某种逻辑,以便在这种情况下…当我们尝试添加对象“ second”而不是向arrayList添加新对象时,我们将second.getNum()添加到first.getNum()。因此,如果要遍历ArrayList,它将是 我在想出一种优雅的方式来解决这个问题时遇到了麻烦。随着arraylist

  • 我有一个包含许多条目的ArrayList,我希望颠倒顺序或字符,因此如果我的代码如下所示: 那么我希望ArrayList包含的内容是: 我只使用集合更改了整个ArrayList中条目的顺序。

  • 问题内容: 我有一个字符串数组列表,并在其中添加了一些重复值。我只想删除那个重复的值,那么如何删除它。 在这个例子中我有一个主意。 但是有没有足够的方法来删除该重复表格列表。没有使用For循环?我可以通过使用HashSet或其他方式来做到这一点,但只能使用数组列表。想对此提出您的建议。谢谢您的提前答复。 问题答案: 您可以从列表中创建一个。在将包含每个元素只有一次,在相同的顺序。然后从创建一个新的

  • 问题内容: 谢谢Marko。我重写代码。尝试使其简单。这次它可以真正编译。但它只能删除彼此相邻的重复项。例如,如果我输入1 2 3 3 4 4 5 1,则输出为1 2 3 4 5 1。最后它无法拾取重复项。(顺便说一句:本网站的新内容,如果使任何显示混乱我的歉意) 这是新的代码: 问题答案: 要回答“删除java arraylist中的重复项”问题: 只需将所有元素放到中,就可以完成。 -要么-

  • 问题内容: 我想从下表中删除多个重复的键: 希望它像 我正在使用mysql。这是可能的吗?我不能使用 查询来进行唯一的输入,因为我希望将这些重复的输入输入到表中。 问题答案: 一种方法是使用将表联接到子查询上。子查询得到最低为每。当记录在子查询上不匹配时,仅表示它没有匹配的记录并且可以安全地删除。 SQLFiddle演示 但是,如果的记录可以具有不同的名称,则您需要在子句中包括它们,否则将仅保留最

  • 我在冬眠中面临一个奇怪的问题。在多线程环境中操作,当尝试插入到其中一个表中时,在表中获得重复的条目。只有主键不同,其余所有其他字段都是完全重复的。 使用Hibernate+Oracle和使用Spring-HibernateTemplate对象。 下面是我的BO类的相关部分,以及下面给出的保存对象的代码。不使用任何瞬态场。 我已经检查了与此相关的其他帖子,但没有一篇针对问题的根本原因。我不想在db表