比较两个ArrayLists,删除匹配的项目

时间:2015-03-14 21:17:31

标签: java android arraylist

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

这是我正在使用的逻辑。

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

另外一个是我的自定义类,用作数组列表的Object。

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

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

2 个答案:

答案 0 :(得分:3)

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

如果您没有定义正确的equals(),则使用Object类中的一个定义(所有类隐式地从Object类继承)并且实现仅检查参考文献(Object java doc for equals),并且通常你想要的。

作为一个很好的衡量标准,您还应该定义一个hashCode()方法来覆盖Object中的方法。例如,如果您打算将对象用作HashMap中的键或HashSet中的元素,则此功能非常有用。

如果您使用像Eclipse这样的IDE,那么应该有生成这两种方法的选项。我们的想法是使用类属性来确定 2个对象是如何相同的。

修改 以下是Eclipse在使用菜单&#34; Source&gt; Generate hashCode()和equals()...&#34;时给出的默认实现。我选择在类中生成所有属性。如果您不希望属性成为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;
}

应该是:

Date calendarDate;

public Date getCalendarDate() {
    return calendarDate;
}

类成员以小写字母开头。类成员或类名中没有连字符。使用CamelCase(对于类名称)或camelCase(对于成员名称)。

答案 1 :(得分:1)

以下是完成任务所需遵循的算法:

  • 构建两个数组的并集
  • 构建两个数组的交集
  • 从联合中减去交集以获得结果

参考:检查此answer