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

时间:2015-05-27 09:49:36

标签: java list arraylist javabeans

我有一个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
    ...
}

6 个答案:

答案 0 :(得分:3)

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

persons.set(0,changed);

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

然后

persons.put (personID, changed);

将替换ID为personID的Person(您需要在Person类中拥有一些唯一属性,并覆盖hashCodeequals才能使其工作)

答案 1 :(得分:2)

你应该告诉java“在什么基础上我应该考虑两个人平等”?为此,您必须覆盖equals()方法并根据firstNamelastName进行相等性检查。但是因为它是一个列表,所以你必须迭代它并使用contains(Person p)方法来检查它是否存在(哪个将使用equals方法)。找到匹配的Person对象后,可以替换它(使用索引)。

答案 2 :(得分:1)

首先确定可以使用哪个或哪些属性来验证2个对象是否相等然后覆盖人的equals和hashcode,然后迭代并比较,然后在找到时替换。

答案 3 :(得分:1)

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

你的Person类:

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);//
}

答案 4 :(得分:1)

在你的bean类中为要检查相似性的变量生成hashcode和equals方法(在你的情况下是person类中的firstName属性).if使用eclipse然后按ctrl + shift + s显示生成hashcode的选项和等于方法。 这样做是为了覆盖默认的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;
    }

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

答案 5 :(得分:0)

您可以使用List#indexOf(obj)方法获取&#34;相同&#34;的索引。对象,并使用List#set(index, object)更新它。

请注意,它会要求您覆盖对象的equals()方法。
另请注意:此操作效率低,如果列表很大且更改次数频繁 - 请考虑从列表切换到更智能的&#34;数据类型,例如Set