在我的java
代码中,我有一个结构Person
:
public class Person {
String name;
String distance;
String address;
String field1;
String field2;
}
现在,我有一个包含几个对象的ArrayList<Person> people
。我还有另一个包含其他对象的ArrayList<Person> otherPeople
。
我想制作一个第3个列表,其中包含people
中尚未包含的所有otherPeople
对象。
但我只需要按name
,distance
和address
比较对象,我不关心field1
和field2
的值
我考虑过创建2个for循环:
for (Person newPerson: people) {
for (Person oldPerson: otherPeople) {
if(newPerson.getName().equals(oldPerson.getName()) &&
newPerson.getDistance().equals(oldPerson.getDistance()) &&
newPerson.getAddress().equals(oldPerson.getAddress()) {
但我不知道如何继续,特别是因为我无法从我正在迭代的列表中删除元素... 你能帮帮我吗?
答案 0 :(得分:5)
你可以覆盖Person类的相等方法吗? 然后,您将能够使用方法remove或removeAll从集合中删除person。
class Person {
String name;
String distance;
String address;
String field1;
String field2;
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(distance, person.distance) &&
Objects.equals(address, person.address);
}
@Override
public int hashCode() {
return Objects.hash(name, distance, address);
}
}
class Example {
public static void main(String[] args) {
Person person1 = new Person();
person1.address = "address_1";
person1.distance = "distance_1";
person1.name = "name_1";
person1.field1 = "field1_1";
person1.field2 = "field2_2";
Person person2 = new Person();
person2.address = "address_2";
person2.distance = "distance_2";
person2.name = "name_2";
person2.field1 = "field1_2";
person2.field2 = "field2_2";
ArrayList<Person> people = new ArrayList<>(Arrays.asList(person1, person2));
System.out.println(people);
ArrayList<Person> otherPeople = new ArrayList<>(Arrays.asList(person1));
people.removeAll(otherPeople);
System.out.println(people);
}
}
答案 1 :(得分:1)
您可以尝试以下方式:
public static void main(String[] args) {
ArrayList<Person> people = new ArrayList<>();
ArrayList<Person> otherPeople = new ArrayList<>();
ArrayList<Person> peopleDistinct = new ArrayList<>(people);
peopleDistinct.removeAll(otherPeople);
}
但首先,您必须为equals
类重新定义Person
方法。
编辑:这是一个如何覆盖equals
方法的示例:
@Override
public boolean equals(Object other) {
boolean result = false;
if (other instanceof Person) {
Person that = (Person) other;
result = (this.name == that.name && this.distance == that.distance && this.address == other.address);
}
return result;
}
注意:如果等号函数需要field1
和field2
,则应添加{。}}。
答案 2 :(得分:0)
在Person类中实现equals()和hashcode()方法,并将哈希码计算为名称,距离,地址的函数。有关更多详细信息,您可以搜索如何编写好的哈希函数。请记住,在equals方法中,如果两个对象具有相同的名称,距离和地址值,则会编写将两个对象视为相等的逻辑。但是,不要忘记实现hashcod(),因为在使用hashset和hashmap时不实现它可能会有进一步的复杂性。
然后以你已经开始的方式使用for循环比较每个人的对象。