如何按用户名聚合不同ID用户的关联IoT设备总数?
按用户名聚合IoT设备总数的最优实现方案
核心思路
通过三次线性遍历完成统计,利用哈希表(Map/字典)实现O(1)的查找与更新,整体时间复杂度为O(N + M)(N为用户数组长度,M为关联IoT设备数组长度),是效率最高的线性时间方案。具体步骤:
- 建立「用户ID→用户名」的映射表,快速通过用户ID获取用户名。
- 统计每个用户ID对应的关联IoT设备数量。
- 按用户名合并不同用户ID的设备数量,得到最终聚合结果。
数据示例
假设输入的三个JSON数组结构如下:
- 用户数组:
[ {"user_id": 1, "username": "张三"}, {"user_id": 2, "username": "李四"}, {"user_id": 3, "username": "张三"} ]
- 关联IoT设备数组(设备数组若仅用于验证设备有效性,可在统计时过滤,此处示例直接用关联数组):
[ {"user_id": 1, "device_id": "iot_001"}, {"user_id": 1, "device_id": "iot_002"}, {"user_id": 2, "device_id": "iot_003"}, {"user_id": 3, "device_id": "iot_004"}, {"user_id": 3, "device_id": "iot_005"}, {"user_id": 3, "device_id": "iot_006"} ]
JavaScript实现
// 输入数据 const users = [ {user_id: 1, username: "张三"}, {user_id: 2, username: "李四"}, {user_id: 3, username: "张三"} ]; const deviceRelations = [ {user_id: 1, device_id: "iot_001"}, {user_id: 1, device_id: "iot_002"}, {user_id: 2, device_id: "iot_003"}, {user_id: 3, device_id: "iot_004"}, {user_id: 3, device_id: "iot_005"}, {user_id: 3, device_id: "iot_006"} ]; // 1. 构建用户ID到用户名的映射 const userIdToName = new Map(); users.forEach(user => userIdToName.set(user.user_id, user.username)); // 2. 统计每个用户ID的设备数量 const userIdDeviceCount = new Map(); deviceRelations.forEach(relation => { const currentCount = userIdDeviceCount.get(relation.user_id) || 0; userIdDeviceCount.set(relation.user_id, currentCount + 1); }); // 3. 按用户名聚合总数 const usernameTotalCount = new Map(); userIdDeviceCount.forEach((count, userId) => { const username = userIdToName.get(userId); if (!username) return; // 跳过无对应用户的关联记录 const total = usernameTotalCount.get(username) || 0; usernameTotalCount.set(username, total + count); }); // 输出结果(转为对象方便查看) console.log(Object.fromEntries(usernameTotalCount)); // 输出:{ '张三': 5, '李四': 1 }
Python实现
# 输入数据 users = [ {"user_id": 1, "username": "张三"}, {"user_id": 2, "username": "李四"}, {"user_id": 3, "username": "张三"} ] device_relations = [ {"user_id": 1, "device_id": "iot_001"}, {"user_id": 1, "device_id": "iot_002"}, {"user_id": 2, "device_id": "iot_003"}, {"user_id": 3, "device_id": "iot_004"}, {"user_id": 3, "device_id": "iot_005"}, {"user_id": 3, "device_id": "iot_006"} ] # 1. 构建用户ID到用户名的映射 user_id_to_name = {user["user_id"]: user["username"] for user in users} # 2. 统计每个用户ID的设备数量 user_id_device_count = {} for relation in device_relations: user_id = relation["user_id"] user_id_device_count[user_id] = user_id_device_count.get(user_id, 0) + 1 # 3. 按用户名聚合总数 username_total_count = {} for user_id, count in user_id_device_count.items(): username = user_id_to_name.get(user_id) if not username: continue username_total_count[username] = username_total_count.get(username, 0) + count # 输出结果 print(username_total_count) # 输出:{'张三': 5, '李四': 1}
扩展处理(可选)
如果需要显示所有用户(包括无关联设备的用户),只需在聚合步骤前先初始化所有用户名的计数为0:
- JavaScript扩展:
const usernameTotalCount = new Map(); // 先初始化所有用户的计数为0 users.forEach(user => usernameTotalCount.set(user.username, 0)); // 再累加设备数 userIdDeviceCount.forEach((count, userId) => { const username = userIdToName.get(userId); if (username) usernameTotalCount.set(username, usernameTotalCount.get(username) + count); });
- Python扩展:
username_total_count = {user["username"]: 0 for user in users} for user_id, count in user_id_device_count.items(): username = user_id_to_name.get(user_id) if username: username_total_count[username] += count
内容的提问来源于stack exchange,提问作者Cerr
相关产品推荐
相关产品推荐

