You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Java中如何移除列表重复项?附代码及尝试情况

Android Java 列表去重解决方案:修复重复项无法移除问题

你用HashSet或distinct方法去重失败的核心原因是:Booking类没有正确重写equals()和hashCode()方法。Java默认用对象内存地址判断是否重复,哪怕两个Booking内容完全一致,也会被当成不同对象,导致去重逻辑失效。

第一步:重写Booking类的equals和hashCode

根据业务逻辑选择判断“重复”的字段(比如用唯一id),示例代码如下:

public class Booking {
    private String id;
    // 其他字段、Getter、Setter

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Booking booking = (Booking) o;
        return Objects.equals(id, booking.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

如果需要多个字段组合判断唯一性,把这些字段都加入equals的比较和hashCode的计算即可。

第二步:两种有效去重实现

方式一:用HashSet去重(兼容Java 7及以下)

先把元素存入HashSet自动去重,再转成List:

@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
    if (task.isSuccessful()) {
        Set<Booking> bookingSet = new HashSet<>();
        for (QueryDocumentSnapshot document : queryDocumentSnapshots) {
            Booking booking = document.toObject(Booking.class);
            bookingSet.add(booking);
        }
        // 更新原有列表
        bookingList.clear();
        bookingList.addAll(bookingSet);
        // 后续更新UI等逻辑
    }
}

方式二:用Stream API的distinct()(Java 8+ 更简洁)

如果项目支持Java 8及以上,用Stream处理更高效:

@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
    if (task.isSuccessful()) {
        bookingList = queryDocumentSnapshots.getDocuments()
                .stream()
                .map(doc -> doc.toObject(Booking.class))
                .distinct()
                .collect(Collectors.toList());
        // 后续处理逻辑
    }
}

内容的提问来源于stack exchange,提问作者donaldD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:30:49