簡體   English   中英

如何從對象數組列表中刪除項目?

[英]how can i remove items from an arraylist of objects?

我是使用Java(netbeans)編程的新手,在嘗試了多種選擇之后,無法從數組列表中刪除員工記錄的項目。

我需要接受用戶輸入的名字和姓氏,ID,年薪和開始日期,然后將此信息添加到要顯示的數組中。 我可以很容易地添加和顯示信息,但是使用相同的方法刪除項目對我來說不起作用。 進行stocking.add()可以正常工作,但不會執行stocking.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);   

    }                                          

在您的情況下,當您嘗試刪除一個元素時,必須牢記要刪除與您傳入參數完全相同的對象,但要做到這一點,您必須實現2種方法來幫助您過程,您必須先了解。

這些方法是equals()和hashCode(), 這里這里都有簡要說明。

現在談論您的示例,您的記錄類必須實現這兩種方法,如下所示:

    @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中來刪除元素。

如果使用Set和Maps,則應添加equals和hashcode實現。

我是Objects Util類的忠實粉絲。 它的集成也為您執行nullchecks。 代碼看起來也更干凈。

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開頭。 為了保持整潔,請對參數,類名和變量使用有意義的名稱。 稍后,如果變得越來越復雜,它將有助於閱讀和理解代碼。

創造你的新紀錄這一翻譯removeButtonActionPerformed方法,你可以先得到你的記錄ArrayList.get()然后使用刪除inventory.remove 另外,如果您知道要刪除的記錄的位置,則可以直接使用inventory.remove(position)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM