LinkedHashSet删除重复对象

ins*_*ict 5 java collections set

我有一个简单的问题,我有类产品,有这样的字段:

private Integer id;
private String category;
private String symbol;
private String desc;
private Double price;
private Integer quantity;
Run Code Online (Sandbox Code Playgroud)

我想根据ID从LinkedHasSet中删除重复项,例如具有相同ID但不同数量的产品将添加到设置中,我想删除(更新)具有相同ID的产品,并且它将由我唯一的id对象,如何要做到这一点?

例如产品:id = 1,类别= CCTV,符号= TVC-DS,desc =简单相机,价格= 100.00,数量= 1 产品:id = 1,类别= CCTV,符号= TVC-DS,desc =简单相机,价格= 100.00,数量= 3

不会被添加到设置中

我的代码:

    public void setList(Set<Product> list) {
    if(list.isEmpty()) 
        this.list = list;
    else {
        this.list.addAll(list);
        Iterator<Product> it = this.list.iterator();
        for(Product p : list) {
            while(it.hasNext()) {
                if(it.next().getId() != p.getId())
                    it.remove();
                    this.list.add(p);   
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*yle 15

所有Set实现都删除重复项,LinkedHashSet也不例外.

根据他们的equals()方法,复制的定义是两个彼此相等的对象.如果你没有覆盖equals你的Product类,那么只有相同的引用才会被认为是相同的 - 而不是具有相同值的不同实例.

因此,您需要为您的类添加更具体的equals(和hashcode)实现.有关示例和指导,请参阅在Java中覆盖equals和hashcode.(请注意,您也必须覆盖hashcode,否则您的类在哈希集中将无法正常运行.)

  • @ user1853125你的`equals()`方法实现错误.你应该比较对象的字段,而不是`hashCode()`结果.完全不同的对象有可能返回相同的哈希码.您应该首先了解hashtables的工作原理以及为什么正确实现`equals()`和`hashCode()`很重要.无论如何,即使你正确地实现`equals()`,代码中也会遇到设计问题,这会在以后引起其他问题 (3认同)