去重工具接收一个文本块, 按行拆开, 删掉每一条与更早某行完全相同的行, 在浏览器内完成. 占位符就是工作示例: apple, banana, apple, cherry, banana, date. 按下 Remove Duplicates 按钮, 结果块在只读框里打印去重后的文本, 上方一行绿字读作 Removed 2 duplicate(s). 不发送任何东西: 拆分, 集合, 拼接全在设备上进行, Clear 按钮清空输入, 输出和计数.
工具接收什么, 给出什么
输入是单个文本框, 10 行高, 可上下拖动, 不需要其他任何东西. 上方有一个 Clear 按钮重置一切, 下方有一个动作按钮 Remove Duplicates, 所以计算不是实时的: 只有按下它, 结果才变. 输出是同样高度的只读文本框, 复制按钮放在 Result 标签旁边, 但只在输出非空时出现. 绿色的计数行, Removed N duplicate(s), 只在 N 大于 0 时出现, 所以没有重复的输入只显示结果, 没有别的.
去重是怎么做的
输入按换行符拆成行的数组, 按顺序遍历, 用一个集合记住所有已保留的行. 一行第一次出现时进集合并进输出列表; 之后每次出现只计一次重复然后丢弃. 保留的行用换行符拼回去, 所以输出就是输入挖掉重复后的样子, 按首次出现的原始顺序, 从不重新排序. 对占位符的 apple, banana, apple, cherry, banana, date, 结果是 apple, banana, cherry, date, 删了 2 条. 遍历是单趟, 所以 100,000 行, 其中 50,000 行唯一, 的输入大约 40 毫秒处理完.
什么算同一行
两行相同, 当且仅当每个字符都匹配, 因为比较是精确字符串测试, 没有任何归一化. 大小写算数, 所以 A 和 a 是不同行, 都保留. 空格算数, 所以带尾随空格的 a 和带前置空格的 a 是不同行, 都保留. 重音算数, 所以 café 和 cafe 是不同行, 都保留. 空行也算行: 空的一行仍是行, 只有一个空格的行是空格行, 所以两条纯空格行归成一条. 如果你的重复只差上述其中一项, 对这个工具它们就不是重复, 计数保持 0.
换行符和空行会发生什么
拆分只看换行符, 所以以换行符结尾的文件会多出一行空的结尾行, 它和任何空行的首次出现一样被保留: a 和 b 各占一行且末尾带换行的输入, 原样回来, 删 0 条. 两个连续空行归成一条; 只有一个换行符的输入删 1 条, 打印空结果, 结果块仍显示但没有复制按钮. Windows 换行是尖刃: 拆分不去回车符, 所以同一文本从 Windows 文件读来与不带回车符的版本不是同一行, 复制的结果会带着回车符.
删除计数怎么读出来
绿字只数被删掉的行, 不数保留的行. 四条相同行 x x x x 删 3 留 1; 交错的输入 1 2 1 2 删 2 留 2; 没有精确重复的输入什么都不显示, 因为那行只在计数大于 0 时渲染. 计数就是输入行数与输出行数之差, 没有别的.
文本去哪里
哪里都不去, 不出设备. 文本框的值由页面读取, 拆分, 集合和拼接都在浏览器内运行, 全程没有任何网络请求. 没有历史, 没有存储的结果: 页面的状态只有三个值, 输入, 输出和计数, Clear 把三个都重置为空和 0. 复制用浏览器剪贴板, 所以只有你按了复制再粘贴到别处, 文本才离开页面.
它不是什么
工具去重行, 不归一化文本: 比较前去掉让近似行显得不同的空格和空行, 用空白字符清理; 去重后把保留的行按字母序排好, 是行排序工具的活; 数每个词出现多少次而不是每行, 是词频统计工具的活. 同类文本工具的详解, 看文本反转指南.