为什么不删除重复副本?

时间:2014-07-16 06:57:46

标签: memory arraylist duplicates

我希望能够将itemOrders添加到ArrayList,然后检查itemOrder是否已经存在。如果那个特定的itemOrder已经在ArrayList中,我只想要保留一个副本。我无法弄清楚为什么这不会删除重复的副本。我甚至尝试将itemOrder转换为字符串并检查字符串是否相同并删除该方式,但我无法使其工作。对我做错的任何帮助?

public void add(ItemOrder itemOrder) {
        this.list.add(itemOrder);
        for (int i=0; i< this.list.size(); i++){
            if (this.list.get(i).equals(itemOrder)){
               this.list.remove(i);
            }
        }
}

我得到这样的结果。

内存格式

[ItemOrder @ 4d459b26]

[ItemOrder @ 4d459b26,ItemOrder @ 343d0d2b]

[ItemOrder @ 4d459b26,ItemOrder @ 343d0d2b,ItemOrder @ 142b9cd8]

字符串格式

[傻腻子,3.95(19.99为10),1]

[傻腻子,3.95(1999为10),1,愚蠢的弦,3.5(10为14.5),0]

[傻腻子,3.95(10为19.99),1,愚蠢的弦,3.5(10为14.5),0,傻腻子,3.95(10为19.99),1]

所以我认为发生的事情是它检查itemOrder的内存,因为它不一样,它让重复通过。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

所以我认为正在发生的事情是它检查itemOrder的内存,因为它不一样,它让重复通过。我该如何解决这个问题?

是的,这是默认行为。

如果你想比较对象的状态/内容,你必须实现equals(如果你这样做,你还必须实现hashCode来匹配它。)

除此之外,正如@alfasin指出的那样,你不能只是在迭代它时从列表中删除元素。这搞砸了索引。只需检查元素是否已经在列表中,只有在元素中才添加。