当前位置: 首页 > 知识库问答 >
问题:

比较两个ArrayList,移除匹配的项

邴星洲
2023-03-14

嗨,我有两个自定义数组列表,我想从一个数组列表中删除与第二个数组列表匹配的类似项。

List<Daily_Stock_Pojo> dailyStockArrayListOne = new ArrayList<Daily_Stock_Pojo>();
List<Daily_Stock_Pojo> dailyStockArrayListTwo = new ArrayList<Daily_Stock_Pojo>();

List<Daily_Stock_Pojo> added = new ArrayList<Daily_Stock_Pojo>(dailyStockArrayListOne);

added.removeAll(dailyStockArrayListTwo);
public class Daily_Stock_Pojo {

    private Date Calendar_Date;
    private int Store_Id;
    private int Item_Id;
    private int Stock_Volume;
    private String MRP;
    private String objectId;

    public Daily_Stock_Pojo(Date calendar_Date, int store_Id, int item_Id, int stock_Volume, String MRP, String objectId) {
        Calendar_Date = calendar_Date;
        Store_Id = store_Id;
        Item_Id = item_Id;
        Stock_Volume = stock_Volume;
        this.MRP = MRP;
        this.objectId = objectId;
    }

    public Date getCalendar_Date() {
        return Calendar_Date;
    }

    public void setCalendar_Date(Date calendar_Date) {
        Calendar_Date = calendar_Date;
    }

    public int getStore_Id() {
        return Store_Id;
    }

    public void setStore_Id(int store_Id) {
        Store_Id = store_Id;
    }

    public int getItem_Id() {
        return Item_Id;
    }

    public void setItem_Id(int item_Id) {
        Item_Id = item_Id;
    }

    public int getStock_Volume() {
        return Stock_Volume;
    }

    public void setStock_Volume(int stock_Volume) {
        Stock_Volume = stock_Volume;
    }

    public String getMRP() {
        return MRP;
    }

    public void setMRP(String MRP) {
        this.MRP = MRP;
    }

    public String getObjectId() {
        return objectId;
    }

    public void setObjectId(String objectId) {
        this.objectId = objectId;
    }
}

共有1个答案

毋承基
2023-03-14

你的算法是对的。您只需为daily_stock_pojo正确定义equals()方法。列表#removeAll()将使用equals()执行匹配并删除元素。

如果您没有定义适当的equals(),则使用Object类中定义的那个(所有类都隐式地继承自Object类),并且实现将只检查引用(对象java文档中的equals),而这通常不是您想要的。

作为一个很好的度量,您还应该定义一个hashCode()方法,该方法重写object中的方法。例如,如果您打算将您的对象用作HashMap中的键或HashSet中的元素,那么这将非常有用。

如果您使用Eclipse这样的IDE,那么应该有一个生成这两个方法的选项。其思想是使用将确定两个对象如何相同的类属性。

当使用菜单“source>generate hashCode()and equals()...”时,Eclipse给出的默认实现如下。我选择从类中生成所有属性。如果不希望属性成为daily_stock_pojo标识的一部分,请将其从方法中删除。

   @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((Calendar_Date == null) ? 0 : Calendar_Date.hashCode());
        result = prime * result + Item_Id;
        result = prime * result + ((MRP == null) ? 0 : MRP.hashCode());
        result = prime * result + Stock_Volume;
        result = prime * result + Store_Id;
        result = prime * result
                + ((objectId == null) ? 0 : objectId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Daily_Stock_Pojo other = (Daily_Stock_Pojo) obj;
        if (Calendar_Date == null) {
            if (other.Calendar_Date != null)
                return false;
        } else if (!Calendar_Date.equals(other.Calendar_Date))
            return false;
        if (Item_Id != other.Item_Id)
            return false;
        if (MRP == null) {
            if (other.MRP != null)
                return false;
        } else if (!MRP.equals(other.MRP))
            return false;
        if (Stock_Volume != other.Stock_Volume)
            return false;
        if (Store_Id != other.Store_Id)
            return false;
        if (objectId == null) {
            if (other.objectId != null)
                return false;
        } else if (!objectId.equals(other.objectId))
            return false;
        return true;
    }
Date Calendar_Date;

public Date getCalendar_Date() {
    return Calendar_Date;
}

应该是:

Date calendarDate;

public Date getCalendarDate() {
    return calendarDate;
}

类成员以小写开头。类成员或类名中没有连字符。使用camelcase(用于类名)或camelcase(用于成员名)。

 类似资料:
  • 我正在做一个学校作业,我必须检查ArrayList teKoop中的某些对象是否不在ArrayList mijnGames中,问题是我一直设置这个错误代码:索引1 out of length 1 out of bounds for length 1 这里有什么明显的问题吗? 如有任何帮助,我们将不胜感激。 因此indexOutOfBound错误已修复,新问题出现:s 它一直返回给我一个空的Arra

  • 问题内容: 我有两个。每个大小为100000。我想比较它们并计算匹配的元素。 这是我的代码: 在这里比较过程要花费很多时间。 如何解决和优化此问题。 问题答案: 您应该使用:返回一个包含collection1中所有元素的集合,这些元素也处于collection2中。

  • 我得到了两个字符串类型arraylist。一个列表包含“book1”、“book2”、“book3”和“book4”。另一个arrayList包含“book1”、“book2”、“book3”。因此,第一个列表的大小为4,第二个列表的大小为3。我创建了另一个与第一个列表大小相等的arrayList 但是当我这样做的时候,我不能设置1,因为我不能进入if状态,有人能帮我吗

  • 问题内容: 我得到了两个String类型的arraylist ..一个包含“ book1”,“ book2”,“ book3”和“ book4”的列表。另一个arrayList包含“ book1”,“ book2”,“ book3”。因此,第一个列表的大小为4,第二个列表的大小为3。我创建了另一个与第一个列表的大小相等的arrayList 如果两个列表之间的内容相等,那么我将设置为1而不是0。 所

  • 给定两个csv文件: 我想创建一个新的csv文件,我们将调用UpdatedList.csv,它具有来自File1.csv的每个条目减去SKU在File1.csv和File2.csv.的任何行 下面的代码会做我想做的,但是我相信有一个更有效的方法。没有循环我怎么能做到这一点?我的代码如下。

  • 我有两个文件file1。txt和file2。txt。 文件1。文本 file2.txt 我想匹配文件1的第1、2和3列。带有文件2第1、4和5列的txt。txt。如果匹配,则将匹配行与以下行一起打印,直到,但不要打印。我用“awk”命令试过了