Java:对ArrayList进行脏检查?

时间:2017-11-16 17:13:40

标签: java arraylist java-8 dirtyread

如何在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
  }
}

有没有更快更好的方式?

2 个答案:

答案 0 :(得分:5)

List#removeAll()方法是你的朋友。

为Animal实施equals()hashCode(),然后:

List<Animal> animalList3 = new ArrayList<Animal>(animalList2);
animalList3.removeAll(animalList1);

答案 1 :(得分:2)

你可以这样做:迭代第二个列表,只保留第一个list等于:已修改(typeplacename相同)

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