比较两个ArrayList,删除匹配的项。

3

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

这是我正在使用的逻辑。

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

给我一个解决方案,如何比较两个自定义数组列表,并从第一个数组列表中删除与第二个数组列表匹配的所有项。

可能是重复的问题:如何从两个数组列表中删除共同的值 - Prudhvi
在我看来,removeAll() 应该能够解决你的问题。你能否描述一下你的问题或者给出一个例子? - madlymad
2个回答

3
你的算法没问题,你只需要正确定义 Daily_Stock_Pojo 类中的equals() 方法。 List#removeAll() 将使用 equals() 来执行匹配并删除元素。
如果你没有定义一个合适的equals(),那么就会使用Object类中定义的方法(所有类都隐式继承自Object类),实现将只检查引用(参见 Object java doc for equals),这通常不是你想要的。
为了更好地保证,你还应该定义一个覆盖ObjecthashCode()方法。例如,如果你想在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;
    }

注意: 您应该遵守Java编码规范,即:
Date Calendar_Date;

public Date getCalendar_Date() {
    return Calendar_Date;
}

Should be:

Date calendarDate;

public Date getCalendarDate() {
    return calendarDate;
}

类成员名称以小写字母开头。类成员名称或类名中不要使用连字符。类名使用CamelCase命名法,成员名称使用camelCase命名法。


是的,我绝对需要创建equals()和hashCode()方法。但是如何编写上述对象类的代码呢?你能为equals()和hashCode()函数编写代码吗? - Srinivas69
可以的!实际上,在Java中,当您定义一个POJO或bean,即持有一些数据并提供getter和(必要时)setter的对象时,您必须重新定义equals()hashCode()方法。这样,您就可以在集合或映射中使用您的对象(例如作为Map中的键)。我将在我的回答中发布这些方法可能是什么。 - T.Gounelle

1

这里有一个算法,你可以按照以下步骤完成任务:

  • 构建两个数组的并集
  • 构建两个数组的交集
  • 从并集中减去交集,得到结果

参考文献:查看 答案


1
我认为你需要重写 Object 类的 equals 方法。 - Florian Prud'homme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接