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
相关产品推荐
相关产品推荐

