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

Firebase数据去重:使用Adapter获取数据并移除ArrayList重复值

解决Firebase获取数据后ArrayList去重的问题

你现在遇到的核心问题是HashSet没法正确识别location相同的Hotels对象——Java默认的HashSet是通过对象的equals()和hashCode()方法判断重复的,如果你的Hotels类没重写这两个方法,哪怕两个对象的location完全一样,HashSet也会把它们当成不同的实例,自然达不到去重效果。

第一步:给Hotels类重写equals()和hashCode()方法

让Hotels类基于location字段判断对象是否相等,这样HashSet才能正确工作。示例代码如下:

public class Hotels {
    private String location;

    // 构造函数、getter、setter方法请自行补充

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

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

第二步:优化去重逻辑

你当前在循环内部反复创建HashSet、清空列表的操作效率很低,完全可以把去重放在循环结束后统一执行:

// Global ArrayList loca = new ArrayList<>();
// onCreate
mRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        loca.clear(); // 先清空旧数据,避免新旧数据重复累加
        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
            Hotels hotels = postSnapshot.getValue(Hotels.class);
            loca.add(hotels);
        }
        // 循环结束后统一去重
        HashSet<Hotels> hs = new HashSet<>(loca);
        loca.clear();
        loca.addAll(hs);
        // 这里记得通知Adapter数据更新,比如调用notifyDataSetChanged()
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // 别忘了处理监听取消的异常情况
        Log.e("FirebaseError", databaseError.getMessage());
    }
});

可选:添加时直接去重(更高效)

如果不想等到最后统一处理,也可以在添加前先判断列表中是否已有相同location的对象,避免重复添加:

mRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        loca.clear();
        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
            Hotels hotels = postSnapshot.getValue(Hotels.class);
            boolean isDuplicate = false;
            for (Hotels h : loca) {
                if (h.getLocation().equals(hotels.getLocation())) {
                    isDuplicate = true;
                    break;
                }
            }
            if (!isDuplicate) {
                loca.add(hotels);
            }
        }
        // 更新Adapter
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("FirebaseError", databaseError.getMessage());
    }
});

这样处理后,你的列表就能得到{"USA", "CANADA"}的期望结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:42:32