Java:ArrayList 的脏检查?

问题描述 投票:0回答:2

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

有没有更快和/或更好的方法?

java arraylist java-8 dirtyread
2个回答
5
投票

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

为动物实施

equals()
hashCode()
,然后:

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

2
投票

您可以这样做:迭代第二个列表并仅保留第一个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); }
    
© www.soinside.com 2019 - 2024. All rights reserved.