【问题标题】:how can i remove items from an arraylist of objects?如何从对象数组列表中删除项目?
【发布时间】:2019-04-13 20:12:01
【问题描述】:

我对使用 Java (netbeans) 编程有点陌生,在尝试不同的选项很长一段时间后,我无法从员工记录的数组列表中删除项目。

我需要接受用户输入的名字和姓氏、ID、年薪和开始日期,然后将此信息添加到要显示的数组中。我可以很容易地添加和显示信息,但是使用相同的方法删除项目对我不起作用。执行inventory.add() 工作正常,但不是inventory.remove()。这就是我现在所做的,使用了我为了这项活动而必须使用的技术。

ArrayList <records> inventory = new ArrayList <records>();

    class records {
        String IDNumber, firstName, lastName, annualSalary, startDate;
        records (String temp1, String temp2, String temp3, String temp4, String temp5) {
            IDNumber = temp1;
            firstName = temp2;
            lastName = temp3;
            annualSalary = temp4;
            startDate = temp5;
        }
    }


    private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                          

    String IDNumber, firstName, lastName, annualSalary, startDate;

    records eRec;

    IDNumber = IDNumberInput.getText();
    firstName = firstNameInput.getText();
    lastName = lastNameInput.getText();
    annualSalary = annualSalaryInput.getText();
    startDate = startDateInput.getText();

    eRec = new records(IDNumber, firstName, lastName, annualSalary, startDate);
    inventory.add(eRec);

    }                                         

    private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             

    String IDNumber, firstName, lastName, annualSalary, startDate;

    records eRec;

    IDNumber = IDNumberInput.getText();
    firstName = firstNameInput.getText();
    lastName = lastNameInput.getText();
    annualSalary = annualSalaryInput.getText();
    startDate = startDateInput.getText();

    eRec = new records(IDNumber, firstName, lastName, annualSalary, startDate);
    inventory.remove(eRec);

    }                                            

    private void listButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           

    String temp="";

        for (int x=0; x<=inventory.size()-1; x++) {
            temp = temp + "- " + inventory.get(x).firstName + " "
                    + inventory.get(x).lastName + " — ID Number: "
                    + inventory.get(x).IDNumber + "\nAnnual Salary: $"
                    + inventory.get(x).annualSalary + " — startDate: "
                    + inventory.get(x).startDate + "\n";
        }
        outputArea.setText(temp);   

    }                                          

【问题讨论】:

  • 欢迎来到 Stack Overflow。你能正确缩进你的代码吗? Netbeans 可以为您做到这一点,对于没有编写代码的人来说,在没有适当缩进的情况下获得结构真的很难。我认为当你的问题没有引起太多关注时,可能是因为你忘记了 java 标签;我刚才加了。

标签: java object arraylist


【解决方案1】:

如果您正在使用 Set 和 Maps,您应该添加 equals 和 hashcode 实现。

我是 Objects Util 类的忠实粉丝。它的集成也为你做空检查。而且代码看起来更干净。

public class Records {

    String idNumber, firstName, lastName, annualSalary, startDate;

    Records(String idNumber, String firstName, String lastName, String annualSalary, String startDate) {
        this.idNumber = idNumber;
        this.firstName = firstName;
        this.lastName = lastName;
        this.annualSalary = annualSalary;
        this.startDate = startDate;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Records)) {
            return false;
        }
        Records that = (Records) o;
        return Objects.equals(idNumber, that.idNumber)
                && Objects.equals(firstName, that.firstName)
                && Objects.equals(lastName, that.lastName)
                && Objects.equals(annualSalary, that.annualSalary)
                && Objects.equals(startDate, that.startDate);
    }

    @Override
    public int hashCode() {
        return Objects.hash(idNumber, firstName, lastName, annualSalary, startDate);
    }
}

还有一件事我改成了记录类。通常你应该用 UpperCamelCase 写类名,并保持变量名以小camelCase 开头。为了保持简洁,对参数、类名和变量使用有意义的名称。稍后,如果代码变得越来越复杂,它将有助于阅读和理解代码。

【讨论】:

    【解决方案2】:

    在您的情况下,当您尝试删除一个元素时,您必须牢记要删除与您在参数中传递的完全相同的对象,但要做到这一点,您必须实现 2 个有助于你在这个过程中,你必须先了解。

    这两个方法分别是equals()和hashCode(),简要说明可以看herehere

    现在谈论您的示例,您的记录类必须实现这两种方法,如下所示:

        @Override
        public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
    
        if (o == null || getClass() != o.getClass() || !(o instanceof Records)) {
           return false;
        }
    
        Records r = (Records) o;
    
        return (IDNumber.equals(r.getIDNumber()) && 
            firstName.equals(r.getFirstName()) && 
            lastName.equals(r.getLastName()) && 
            annualSalary.equals(r.getAnnualSalary()) && 
            startDate.equals(r.getStartDate()));
        }
    
        @Override
        public final int hashCode() {
            int result = 17;
            if (IDNumber != null) {
                result = 31 * result + IDNumber.hashCode();
            }
            if (firstName != null) {
                result = 31 * result + firstName.hashCode();
            }
            if (lastName != null) {
                result = 31 * result + lastName.hashCode();
            }
            if (annualSalary != null) {
                result = 31 * result + annualSalary.hashCode();
            }
            if (startDate != null) {
                result = 31 * result + startDate.hashCode();
            }
            return result;
       }
    

    之后,您可以完成您正在尝试做的事情,通过像您所做的那样将值通知到您的 inputTexts 来删除元素。

    【讨论】:

    • 可以,但正如用户所说,他是“Java 编程新手”,可能他们仍在学习这些概念,所以不要跳过地图、实用程序、异常和他没有的东西'甚至不知道......看看给定的例子,他们正在学习如何使用简单的GUI添加和删除itens,这是问题的主要目标,而不是处理异常(即使它们可能出现)。不要用大锤敲碎坚果。
    • 是的,但是一些提示可以帮助保持代码整洁,如果已经存在的话,不要开始自己编写这么多东西。当我开始时,如果有人告诉我,我会很高兴的。
    【解决方案3】:

    要在removeButtonActionPerformed 方法中创建新记录,您可以先使用ArrayList.get() 获取记录,然后使用inventory.remove 将其删除。 另外,如果您知道要删除的记录的位置,可以直接使用inventory.remove(position)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2021-10-19
      • 2017-02-11
      相关资源
      最近更新 更多