如何查找自定义数组列表中不存在于另一个数组列表

时间:2017-12-12 23:11:12

标签: java arraylist

ArrayList<ParkingList> Parkings = new ArrayList<ParkingList>();
ArrayList<ParkingList> ParkingsDB = new ArrayList<ParkingList>();

例如,Parkings可能包含(a,b,c,d)对象,而ParkingsDB可能包含(a,b)

我怎样才能找到c,d

我尝试使用这种方法,但它没有用,

ArrayList<ParkingList> temp = new ArrayList<ParkingList>(Parkings);
temp.removeAll(ParkingsDB);

我的班级定义:

public class ParkingList {
     Rectangle R;
     String Name;
     int level;
     String BuildingName;

     public ParkingList(String BuildingName,String Name, Rectangle R, int level) {
         this.R=R;
         this.Name=Name;
         this.level=level;
         this.BuildingName=BuildingName;
     }
}

我只是想知道,我使用的方法是否正确?也许我还有另一个需要解决的问题。

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

2 个答案:

答案 0 :(得分:1)

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

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

e.g。

ArrayList<ParkingList> temp = new ArrayList(Parkings);
temp.removeIf(x -> ParkingsDB.stream()
                                 .anyMatch(e -> e.getName().equals(x.getName())));

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

现在您只需要决定是否提供自己的equalshashCode实施,或者使用上面的示例;在所有情况下,您都需要提供一个标准,用于定义两个给定对象何时相等

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

变量和方法(构造函数除外,它是方法的特殊类型)应以小写字母开头并遵循camelCase命名约定,而不是 Parkings 它应该是停车,而不是名称它应该是名称等。

此外,您似乎自由暴露了ParkingList的状态。 强制执行封装,方法是将所有变量设为私有,并在必要时仅提供getter和setter。

答案 1 :(得分:0)

最简单的方法,就像你已经提到的那样 - 实现ParkingList.equals()方法。例如,您可以通过IDE生成它。

比你的代码:

temp.removeAll(ParkingsDB);

将按预期工作。这是因为列表实现基本上依赖于equals()方法来检查元素。

您也可以使用流:

ArrayList<ParkingList> temp = Parkings.stream()
    .filter(parking -> !ParkingsDB.contains(parking))
    .collect(Collectors.toList());