为了账号安全,请及时绑定邮箱和手机立即绑定

如何从列表中删除重复项?

如何从列表中删除重复项?

一只名叫tom的猫 2019-08-05 15:14:38
如何从列表中删除重复项?我想从列表中删除重复项,但我正在做的是不起作用:List<Customer> listCustomer = new ArrayList<Customer>();    for (Customer customer: tmpListCustomer){   if (!listCustomer.contains(customer))    {     listCustomer.add(customer);   }  }
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

如果该代码不起作用,您可能没有适当地equals(Object)Customer类上实现。

据推测,有一些关键(我们称之为customerId)可以唯一地识别客户; 例如

class Customer {
    private String customerId;
    ...

适当的定义equals(Object)将如下所示:

    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Customer)) {
            return false;
        }
        Customer other = (Customer) obj;
        return this.customerId.equals(other.customerId);
    }

为了完整性,您还应该实现,hashCode以便两个Customer相等的对象将返回相同的哈希值。hashCode上述定义的匹配equals将是:

    public int hashCode() {
        return customerId.hashCode();
    }

值得注意的是,如果列表很大,这不是删除重复项的有效方法。(对于包含N个客户的列表,您将需要N*(N-1)/2在最坏的情况下执行比较;即,当没有重复时。)对于更有效的解决方案,您应该使用类似的东西HashSet来执行重复检查。


查看完整回答
反对 回复 2019-08-05
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

假设您想要保留当前订单并且不想要aSet,也许最简单的是:

List<Customer> depdupeCustomers =
    new ArrayList<>(new LinkedHashSet<>(customers));

如果要更改原始列表:

Set<Customer> depdupeCustomers = new LinkedHashSet<>(customers);customers.clear();customers.addAll(dedupeCustomers);


查看完整回答
反对 回复 2019-08-05
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

java 8更新
你可以使用数组流如下:

Arrays.stream(yourArray).distinct()
                    .collect(Collectors.toList());


查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 398 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信