如何在 Java 中对
ArrayList
执行脏检查?
我有一个对象
Animal
{
String animalName;
String animalType;
String animalPlace
}
我有两个清单:
List<Animal> animalList1 = new ArrayList<Animal>();
List<Animal> animalList2 = new ArrayList<Animal>();
在第一个列表中, 我有价值观:
[0][lion,Carnivorous,Africa]
[1][tiger,Carnivorous,Zambia]
[2][Goat,Herbivorous,Zimbabwe]
在第二个列表中, 我有价值观:
[0][lion,Carnivorous,Africa]
[1][tiger,Carnivorous,Zambia]
[2][Goat,Herbivorous,Norway]
在第二个列表中, 索引 2 处元素的
animalPlace
已从津巴布韦更改为挪威。
如何比较两个列表值以及已更改的值将该对象放入单独的列表中?
List<Animal> animalList3 = new ArrayList<Animal>();
[0] [Goat,Herbivorous,Norway]
我知道传统的做法是使用 for 循环比较列表:
for (int i = 0; i < list1.size(); i++)
{
for (int j = i+1; j < list2.size(); j++)
{
// compare list1 and list2 values
}
}
有没有更快和/或更好的方法?
List#removeAll()方法是你的朋友。
为动物实施
equals()
和 hashCode()
,然后:
List<Animal> animalList3 = new ArrayList<Animal>(animalList2);
animalList3.removeAll(animalList1);
您可以这样做:迭代第二个列表并仅保留第一个list
中也
但不等于的列表:它们已被修改(
type
或
place
,
name
一样)
List<Animal> res = animalList2.stream()
.filter(a -> animalList1.stream()
.anyMatch(b -> !b.equals(a) && b.animalName.equals(a.animalName)))
.collect(Collectors.toList());
List<Animal> animalList1 = new ArrayList<Animal>();
animalList1.add(new Animal("lion", "Carnivorous", "Africa"));
animalList1.add(new Animal("tiger", "Carnivorous", "Zambia"));
animalList1.add(new Animal("Goat", "Herbivorous", "Zimbabwe"));
animalList1.add(new Animal("Donkey", "Herbivorous", "Zimbabwe"));
List<Animal> animalList2 = new ArrayList<Animal>();
animalList2.add(new Animal("lion", "Carnivorous", "Africa")); //not new but no modif X
animalList2.add(new Animal("tiger", "Carnivorous", "Zambia")); //not new but no modif X
animalList2.add(new Animal("Goat", "Herbivorous", "Norway")); //not new and modif V
animalList2.add(new Animal("Horse", "Herbivorous", "Norway")); //new X
最后你只会得到
[Goat,Herbivorous,Norway]
,这是唯一一个从第一个列表到第二个列表的更新
equals()
:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return animalName.equals(animal.animalName) && animalType.equals(animal.animalType) && animalPlace.equals(animal.animalPlace);
}