Java:ArrayList的脏检查?

Java:ArrayList的脏检查?,java,arraylist,java-8,dirtyread,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>(); 在

如何在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处元素的动物区已从津巴布韦变为挪威。 如何比较这两个列表值和已更改的值,将该对象放在单独的列表中

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
  }
}
有没有更快和/或更好的方法?

这种方法是你的朋友

为Animal实现equals和hashCode,然后:

List<Animal> animalList3 = new ArrayList<Animal>(animalList2);
animalList3.removeAll(animalList1);
方法是你的朋友

为Animal实现equals和hashCode,然后:

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

您可以这样做:迭代第二个列表,只保留第一个列表中也存在但不相等的列表:它们已被修改类型或位置,名称相同


您可以这样做:迭代第二个列表,只保留第一个列表中也存在但不相等的列表:它们已被修改类型或位置,名称相同


实现equals方法并保留唯一的方法好吧,似乎您想要比较list1[i]和list2[i]。这不是嵌套循环所做的。正确地做这件事已经快得多了。从找到正确的解决方案开始。然后,如果不够快,就进行优化。正如@azro所说,实现相等。然后可以使用以下命令:list1.stream.filtera->list2.stream.anyMatcha2->a2.equalsa.collectCollectors.toList@JBNizet是的,我需要比较两个listImplement equals方法并保持唯一的方法。好吧,似乎您想要比较list1[i]和list2[i]。这不是嵌套循环所做的。正确地做这件事已经快得多了。从找到正确的解决方案开始。然后,如果不够快,就进行优化。正如@azro所说,实现相等。然后可以使用以下命令:list1.stream.filtera->list2.stream.anyMatcha2->a2.equalsa.collectCollectors.toList@JBNizet是的,我需要比较两个列表。这是只比较新对象还是对象的属性?只打印两个列表中的对象,但不打印两个列表中都相等的对象,因此已更新的对象您假设animalName是唯一的键。如果两个列表都包含[Goat,Herbivoous,津巴布韦]和[Goat,Herbivoous,挪威],则两个条目都将通过anyMatch筛选器。如果存在同名的非相等动物,则两个条目都将出现在修改后的列表中,尽管没有修改。此外,如果您对我的答案投了否决票,并添加了解释您投否决票的注释,然后你根据我的回复删除你的评论,礼貌的做法是a删除否决票,或者b发布另一条评论,解释为什么你仍然否决我的答案。这是只比较新对象还是来自该对象的属性?只打印两个列表中但两个列表中不相等的对象,因此,那些已经更新的,您假设animalName是一个唯一的键。如果两个列表都包含[Goat,Herbivoous,津巴布韦]和[Goat,Herbivoous,挪威],则两个条目都将通过anyMatch筛选器。如果存在同名的非相等动物,则两个条目都将出现在修改后的列表中,尽管没有修改。此外,如果您对我的答案投了否决票,并添加了解释您投否决票的注释,然后你根据我的回复删除你的评论,a删除否决票是礼貌的,b发布另一条评论解释为什么你仍然否决我的答案。@azro在animalList2中更新的动物不应该等于animalList1中的动物,因此removeAll不会从新创建的animalList3中删除更新的动物。因此,animalist3将包含所有新的和修改的条目。OP没有指出是否存在新条目,以及如果出现新条目该怎么办。同样,OP没有指定在条目被删除时要做什么。但是,如果只对列表中的条目进行了修改,则所有修改的条目都将显示在animalist3中。@azro在animalist2中更新的动物不应等于animalist1中的动物,因此removeAll不会从新创建的animalist3中删除更新的动物。因此,animalist3将包含所有新的和修改的条目。OP没有指出是否存在新条目,以及如果出现新条目该怎么办。同样,OP没有指定在条目被删除时要做什么。但如果只对列表中的条目进行修改,则所有修改的条目都将显示在animalList3中。
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
@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);
}