如何更新 ArrayList 中某个位置的对象?

How to update on object at a certain position in an ArrayList?

我有一个包含 10 个对象的 ArrayList。

List<Person> persons = new ArrayList<>();
persons.add(new Person("Jean", "Pol", "receptionist", 29));
persons.add(new Person("Jef", "Snijders", "guardener", 42));
persons.add(new Person("Piet", "Peters", "truck driver", 54));
persons.add(new Person("Peet", "Polders", "professor", 63));
persons.add(new Person("Nell", "Van Den Walle", "student", 19));
persons.add(new Person("Nady", "Van Toren", "cleaning", 27));
persons.add(new Person("Jenny", "De Koster", "police", 39));
persons.add(new Person("Malena", "Zetterman", "air traffic controler", 45));
persons.add(new Person("Medina", "Zegers", "test engineer", 25));
persons.add(new Person("Horaire", "Safrina", "manager", 39));

应用程序中的另一种方法创建了一个已更改的对象:

Person changed = new Person("Jean", "Pol", "officer", 30);

如何在列表中找到这个对象,并更新列表? (这实际上应该更新列表中的第一个对象)

这是 Person bean:

public class Person {

    private String firstName;
    private String lastName;
    private String jobTitle;
    private int age;

    public Person() {
    }

    public Person(String firstName, String lastName, String jobTitle, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.jobTitle = jobTitle;
        this.age = age;
    }


    // Getters and setters
    ...
}

可以通过以下方式更改列表中的元素:

persons.set(0,changed);

但是,找到要更改的元素的索引需要遍历整个列表。您应该考虑改用 HashMap(其中键标识人员)。

然后

persons.put (personID, changed);

将替换 ID 为 personID 的人(您需要在人 class 中有一些唯一的 属性,并覆盖 hashCodeequals 为了使这项工作)。

您可以使用 List#indexOf(obj) method to get the index of the "identical" object, and update it using List#set(index, object).

请注意,它需要您为您的对象重写 equals() 方法。
另请注意:此操作效率低下,如果列表很大且更改次数频繁 - 考虑从列表切换到 "smarter" 数据类型,例如 Set .

你应该告诉 java 关于 "On what basis should i consider two person equals" 的事情?为此,您必须覆盖 equals() 方法并根据 firstNamelastName 进行相等性检查。但是,由于它是一个列表,因此您必须对其进行迭代并使用 contains(Person p) 方法来检查它是否存在(这将使用 equals 方法)。一旦找到匹配的 Person 对象,就可以替换它(使用索引)。

首先决定哪些 属性 或属性可用于验证 2 个对象是否相等,然后覆盖人员的等于和哈希码,然后迭代和比较,然后在找到时替换。

找到对象的最佳方法是在 Person class 中覆盖两个方法 equals(Object o)hashCode(),这将定义一个唯一的 Person

你的人class:

class Person {
...

@Override
public boolean equals(Object o){
// your code here
}

@Override
public int hashCode(){
//your code here
}

}

如果顺序对你来说不重要,你可以使用HashMap

例如:

Person p;//
myMap.put(p.hashCode(),p);

然后从你申请的其他部分得到你的人;

Person otherP;//
myMap.put(otherP.hashCode(), otherP) // this will replaces the previous person with the same hashCode with the modified code

如果你不想添加一个不存在的人,你可以先检查它是否存在

if(myMap.containsKey(otherP.hashCode()){
    myMap.put(otherP.hashCode(), otherP);//
}

在你的 bean class 中为你想要检查相似性的变量生成哈希码和 equals 方法(在你的例子中是 firstName 属性 亲自 class)。如果使用 eclipse然后按 ctrl+shift+s 显示生成 hashcode 和 equals 方法的选项。 这样做是为了覆盖默认的 equals 方法。请确保您只选择您知道相同的属性。

if (List.contains(new_object)) { // checking if object is in the list
    int indexPos = List.indexOf(new_object); // getting the index if there
    dbStockObjList.set(indexPos, new_object);//adding it in the index
}

您的 bean 的 hashcode 和 equals 方法如下所示:

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (firstName == null) {
            if (other.firstName != null)
                return false;
        } else if (!firstName.equals(other.firstName))
            return false;
        return true;
    }

希望这能正确回答您的问题。