Как я могу удалить элементы из массива объектов? - PullRequest
0 голосов
/ 13 апреля 2019

Я в некотором роде новичок в программировании на Java (netbeans), и у меня возникают проблемы с удалением элементов из массива для записей сотрудников после довольно долгого времени, когда я пробую разные варианты.

Мне нужно принять пользовательский ввод для имени и фамилии, идентификатора, годовой зарплаты и даты начала, а затем добавить эту информацию в массив для отображения. Я могу добавлять и отображать информацию довольно легко, но удаление элементов теми же методами не работает для меня. Выполнение 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);   

    }                                          

Ответы [ 3 ]

0 голосов
/ 03 мая 2019

В вашем случае, когда вы пытаетесь удалить элемент, вы должны иметь в виду, что вы хотите удалить точно такой же объект, который вы передаете в параметрах, НО ДЛЯ ЭТОГО, вы должны реализовать 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, как вы это сделали.

0 голосов
/ 03 мая 2019

Если вы работаете с Set и Maps, вы должны добавить равенства и реализации хэш-кода.

Я большой поклонник класса 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.И чтобы сохранить его в чистоте, используйте значимые имена для параметров, имен классов и переменных.В дальнейшем это поможет многим прочитать и понять код, если он становится более сложным.

0 голосов
/ 14 апреля 2019

Вместо создания новой записи в вашем методе removeButtonActionPerformed вы можете сначала получить свою запись с помощью ArrayList.get(), а затем удалить ее с помощью inventory.remove. Кроме того, вы можете напрямую использовать inventory.remove(position), если знаете позицию записи, которую хотите удалить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...