我有一个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
...
}
答案 0 :(得分:3)
更改列表中的元素可以通过以下方式完成:
persons.set(0,changed);
但是,找到要更改的元素的索引需要遍历整个List。您应该考虑使用HashMap(其中键标识Person)。
然后
persons.put (personID, changed);
将替换ID为personID
的Person(您需要在Person类中拥有一些唯一属性,并覆盖hashCode
和equals
才能使其工作)
答案 1 :(得分:2)
你应该告诉java“在什么基础上我应该考虑两个人平等”?为此,您必须覆盖equals()
方法并根据firstName
和lastName
进行相等性检查。但是因为它是一个列表,所以你必须迭代它并使用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
。