java - 如何查找自定义数组列表中不存在于另一个数组列表中的元素

标签 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;
     }
}

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

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

最佳答案

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

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

例如

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

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

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

<小时/>

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

变量和方法(除了构造函数,这是一种特殊类型的方法)应以小写字母开头,并遵循驼峰命名约定,即而不是Parkings它应该是 parking 场,而不是名称,它应该是名称等。

此外,您似乎已经自由公开了ParkingList的状态。您应该在这里通过将所有变量设置为私有(private)来强制封装,并且仅在必要时提供getter和setter。

关于java - 如何查找自定义数组列表中不存在于另一个数组列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783065/

相关文章:

java - 克隆java ArrayList并防止其被修改

java - 根据属性从 Arraylist 获取元素 - Java

java - 查找字符串中某个重复字符/子字符串的每个位置

java - 来自对象的 ArrayList 和对象的特定名称

java - 切入点注释与最终字符串

java - 服务器关闭时 Webstart 应用程序非常慢

java - 将文件中的对象读取到数组列表中

java - 我的光标不为空,但无法将它们设置为 ArrayList.NullPointerException 错误

java - @after @before 只用了一次,几次@test

java - WMS 的最佳 WebGIS 框架