Java 如何查找自定义数组列表中其他数组列表中不存在的元素

Java 如何查找自定义数组列表中其他数组列表中不存在的元素,java,arraylist,Java,Arraylist,我的班级定义: ArrayList<ParkingList> temp = new ArrayList<ParkingList>(Parkings); temp.removeAll(ParkingsDB); 我只是想知道,我在上面使用的方法是正确的吗?也许我还有一个问题需要解决 我的标准是,,只有当一个对象中的所有属性在另一个对象中相同时,两个对象才是相等的。为了在自定义类型集合上使用removeAll,您需要提供equals方法的实现,如果可能,还需要提供hashCo

我的班级定义:

ArrayList<ParkingList> temp = new ArrayList<ParkingList>(Parkings);
temp.removeAll(ParkingsDB);
我只是想知道,我在上面使用的方法是正确的吗?也许我还有一个问题需要解决

我的标准是,,只有当一个对象中的所有属性在另一个对象中相同时,两个对象才是相等的。

为了在自定义类型集合上使用removeAll,您需要提供equals方法的实现,如果可能,还需要提供hashCode方法,因为集合API中的某些集合使用它

另一种解决方案是使用removeIf并指定定义两个或多个对象何时相等的标准

e、 g

在这种情况下,标准是当temp中的任何给定对象与ParkingsDB中的任何给定对象具有相同名称时,应将其从temp列表中删除

现在,您只需决定是提供自己的equals和hashCode实现,还是使用上面的示例;在所有情况下,您都需要提供一个标准来定义两个给定对象何时相等

这与当前的问题无关,但您似乎根本不尊重Java命名约定

变量和方法(构造函数除外,构造函数是一种特殊类型的方法)应以小写字母开头,并遵循camelCase命名约定,即不应使用Parkings,而应使用Parkings,而应使用Name等


而且,你似乎已经自由地暴露了停车场的状态。您应该在这里强制封装,使所有变量都是私有的,并且只在必要时提供getter和setter。

前面已经提到过,这是实现ParkingList.equals方法最简单的方法。例如,您可以通过IDE生成它

比您的代码:

ArrayList<ParkingList> temp = new ArrayList(Parkings);
temp.removeIf(x -> ParkingsDB.stream()
                                 .anyMatch(e -> e.getName().equals(x.getName())));
我会像你期望的那样工作。这是因为列表实现基本上依赖于检查元素的equals方法

您也可以使用流:

temp.removeAll(ParkingsDB);

定义不起作用。ParkingList是如何定义的?根据什么标准两个对象相等?例如,Parkings包含这两个对象对象1:mall,c1,rectangle1,1对象2:school,b1,rectangle2,2 ParkingDB仅包含这一个对象:对象1:mall,c1,rectangle1,1我想查找Parkings中但不在ParkingDB中的对象,任何一个元素值不同的对象都是不相等的。因此,关于如何在基元数组和各种类型的集合上找到子集、超集、集差异等问题,有几十个,可能有几百个。您首先要意识到的是,您使用的是ArrayList而不是其他类型的列表或任何其他类型的集合这一事实是不相关的。这是指对象1的所有属性都等于其他数组列表中的对象2?或者这只是当我们找到一个相等的属性时?@Aominè。为了完全正确,OP没有说允许变异停车。
ArrayList<ParkingList> temp = new ArrayList(Parkings);
temp.removeIf(x -> ParkingsDB.stream()
                                 .anyMatch(e -> e.getName().equals(x.getName())));
temp.removeAll(ParkingsDB);
ArrayList<ParkingList> temp = Parkings.stream()
    .filter(parking -> !ParkingsDB.contains(parking))
    .collect(Collectors.toList());