如何更新 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 中有一些唯一的 属性,并覆盖 hashCode
和 equals
为了使这项工作)。
您可以使用 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()
方法并根据 firstName
和 lastName
进行相等性检查。但是,由于它是一个列表,因此您必须对其进行迭代并使用 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;
}
希望这能正确回答您的问题。
我有一个包含 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 中有一些唯一的 属性,并覆盖 hashCode
和 equals
为了使这项工作)。
您可以使用 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()
方法并根据 firstName
和 lastName
进行相等性检查。但是,由于它是一个列表,因此您必须对其进行迭代并使用 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;
}
希望这能正确回答您的问题。