双重循环去重本质是遍历数组,对每条日志与之前所有日志比对,仅保留首次出现的记录;需手动比较对象字段(如time+msg拼接),时间复杂度o(n²),适用于小数据或学习场景。

用双重循环过滤重复日志记录,本质是遍历数组,对每条日志与它之前(或之后)的所有日志做比对,保留首次出现的记录。虽然效率不高(时间复杂度 O(n²)),但在小数据量、调试场景或学习目的下仍可使用。
核心思路:只保留第一次出现的记录
关键不是“删重复”,而是“收集不重复的首个”。通常新建一个空数组,外层循环逐个取原日志项,内层循环检查该项是否已在结果数组中出现过;若未出现,就 push 进去。
按完整对象内容去重(推荐初学理解)
假设日志是对象数组,如 [{time: "08:00", msg: "start"}, {time: "08:02", msg: "login"}, {time: "08:00", msg: "start"}],需判断两个对象是否“内容相同”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不能直接用 === 或 == 比较对象(引用不同即为 false)
- 需手动比对关键字段,例如 time + msg 拼接成唯一标识,或逐个属性判断
- 示例代码(基于字符串拼接判重):
const logs = [
{time: "08:00", msg: "start"},
{time: "08:02", msg: "login"},
{time: "08:00", msg: "start"},
{time: "08:05", msg: "exit"}
];
const uniqueLogs = [];
for (let i = 0; i
<h3>按单个字段(如 id 或时间戳)快速去重</h3>
<p>如果日志有唯一标识字段(如 <strong>id</strong> 或精确到毫秒的 <strong>timestamp</strong>),可简化内层逻辑:</p>
- 用一个 Set 或普通数组存已见过的 id 值
- 外层循环中,查该 id 是否存在;不存在则记录日志并加入已见集合
- 这样内层只需一次查找(Set.has 是 O(1)),但仍是双重循环结构
注意事项和替代建议
双重循环适合理解去重逻辑,但实际项目中要注意:
- 大数据量(如上千条日志)时性能明显下降,应改用 Map / Set + 单次遍历
- 日志时间字段若含毫秒且来自不同来源,可能看似相同实则不同,需确认业务意义上的“重复”定义
- 若需保留最后一条而非第一条,可反向遍历,或先翻转再正向处理
- 现代写法更推荐:[...new Map(logs.map(l => [l.time + '|' + l.msg, l])).values()]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










