Flutter中如何去除自定义对象列表中相同姓名手机号的重复项
联系人列表去重实现方案
判断两个联系人对象是否为重复项的核心标准为:displayName(姓名)与phoneNumbers(手机号)两个字段的值完全相等,任意一个字段不同就不属于重复项,针对不同使用场景可以选择以下实现方式:
场景1:现有含重复项的列表做一次性去重
可以用临时集合存储已经出现过的姓名+手机号组合,遍历原列表筛选出不重复的对象即可,Dart示例代码如下:
// 存储已经出现过的唯一标识组合 Set<String> uniqueKeys = {}; List<myContactsModel> filteredContacts = originalContacts.where((contact) { String key = '${contact.displayName}_${contact.phoneNumbers}'; if (uniqueKeys.contains(key)) { return false; } uniqueKeys.add(key); return true; }).toList();
执行完后filteredContacts就是已经去重完成的无重复列表。
场景2:新增联系人时实时校验避免重复
每次往列表添加新联系人之前,先判断列表中是否已经存在相同姓名+手机号的对象,存在就不执行新增操作:
void addContactIfNotExist(List<myContactsModel> contactList, myContactsModel newContact) { bool isDuplicate = contactList.any((contact) => contact.displayName == newContact.displayName && contact.phoneNumbers == newContact.phoneNumbers ); if (!isDuplicate) { contactList.add(newContact); } }
优化方案:重写类的相等判断逻辑
如果后续需要频繁做重复判断,可以直接在myContactsModel类里重写==运算符和hashCode,把两个字段的相等判断逻辑内置到类本身:
class myContactsModel { final String displayName; final String phoneNumbers; final dynamic avatar; myContactsModel({ required this.displayName, required this.phoneNumbers, required this.avatar, }); @override bool operator ==(Object other) => identical(this, other) || other is myContactsModel && runtimeType == other.runtimeType && displayName == other.displayName && phoneNumbers == other.phoneNumbers; @override int get hashCode => displayName.hashCode ^ phoneNumbers.hashCode; }
重写之后直接用contains方法就能判断重复,也可以直接把列表转成Set再转回List实现一键去重:
List<myContactsModel> filteredContacts = originalContacts.toSet().toList();
内容的提问来源于stack exchange,提问作者Benson OO
相关产品推荐
相关产品推荐

