C#中高效检测学生列表重复地址并获取对应对象的方法
高效筛选含重复地址的Student对象
要替代嵌套循环实现更高效的筛选,核心思路是用哈希表统计地址的出现频次,分两步完成:
- 第一步:遍历所有学生的地址,用哈希表记录每个地址出现的次数
- 第二步:再次遍历学生列表,只要该学生的地址中存在任意一个出现次数大于1的地址,就将其保留
JavaScript 实现示例
const students = [ { ID: 1, Addresses: ["SRJ", "SJ"] }, { ID: 2, Addresses: ["SJ"] }, { ID: 3, Addresses: ["FRT", "FRI"] }, { ID: 4, Addresses: ["NR", "SJ"] } ]; // 统计每个地址的出现频次 const addressCount = {}; students.forEach(student => { student.Addresses.forEach(addr => { addressCount[addr] = (addressCount[addr] || 0) + 1; }); }); // 筛选包含重复地址的学生 const duplicateAddressStudents = students.filter(student => { return student.Addresses.some(addr => addressCount[addr] > 1); }); console.log(duplicateAddressStudents);
Python 实现示例
students = [ {"ID": 1, "Addresses": ["SRJ", "SJ"]}, {"ID": 2, "Addresses": ["SJ"]}, {"ID": 3, "Addresses": ["FRT", "FRI"]}, {"ID": 4, "Addresses": ["NR", "SJ"]} ] # 统计地址出现频次 address_count = {} for student in students: for addr in student["Addresses"]: address_count[addr] = address_count.get(addr, 0) + 1 # 筛选目标学生 result = [student for student in students if any(address_count[addr] > 1 for addr in student["Addresses"])] print(result)
复杂度说明
这种实现的时间复杂度为 O(M),其中M是所有学生的地址总数量。相比嵌套循环的O(N²)(N为学生数量),在数据量较大时性能提升非常明显,因为哈希表的读写操作都是O(1)的常数时间。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

