【问题标题】:Compare Two ArrayLists, Remove items that are matched比较两个 ArrayList,删除匹配的项
【发布时间】:2015-03-14 21:17:31
【问题描述】:

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

这是我正在使用的逻辑。

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

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

【问题讨论】:

标签: java android arraylist


【解决方案1】:

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

如果您没有定义正确的equals(),则使用Object 类中定义的那个(所有类都隐式继承自Object 类),并且实现只会检查引用(Object java doc for equals),并且这通常不是你想要的。

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

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

编辑 以下是 Eclipse 在使用菜单“Source>Generate hashCode() and equals()...”时给出的默认实现。我选择从类中生成 all 属性。如果您不希望某个属性成为 Daily_Stock_Pojoidentity 的一部分,请将其从方法中删除。

   @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(成员名)。

【讨论】:

  • 是的,我绝对需要创建 equals() 和 hashCode() 方法。但是为上面的对象类编写代码?你能为equals()和hasCode()函数写代码吗?
  • 是的,你可以!实际上,在 Java 中,当您定义 POJO 或 bean 时,即保存一些数据并提供 getter 以及在需要时提供 setter 的对象,您必须重新定义equals()hashCode() 方法。这样您就可以在集合或映射中使用您的对象(例如作为Map 中的键)。我将在我的答案中发布这些方法。
【解决方案2】:

您可以遵循以下算法来完成任务:

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

参考:检查此answer

【讨论】:

  • 我认为你需要从 Object 重写 equals 方法。
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2015-10-05
  • 1970-01-01
  • 2015-08-04
相关资源
最近更新 更多