859 字
4 分钟
数组去重: 超高速字符串去重 (含保留原顺序的方法)
1. 你需要知道这些
代码适用于:
- 将字符串数组中的重复元素去除, 仅留下一个
应用场景:
- 你有一个超级长的文本文件, 这里面每一行都是一条数据, 例如这些数据是用爬虫获取的搜索关键字, 但可能含有重复, 你现在需要将它们去重. 这个算法可以帮助你快速完成去重的工作
局限性:
- 下面将介绍两种算法
- 一种是先进行排序, 这时, 相同的元素都在一起了, 然后再进行一次遍历去重, 那么除了排序的时间, 仅进行一次遍历就可以去重, 速度很快, 但原有顺序改变了.
- 第二种算法是较为特殊的算法, 借助了引用类型这个特性, 可以保证原有顺序不变, 但需要定义字典和列表, 也就是说要多需要一些内存.
2. 算法的主要内容
主要原理
- 通过排序, 将相同的元素凑到一起, 那么只需要比对当前元素和一个相邻元素就可以得出该元素是否是重复的. 那么只需要遍历一次就可以做到去重.
- 在此基础上, 用Dictionary的根据键可以快速访问值得特性, 将原字符串数组的元素索引与元素引用保存到Dictionary中, 就可以通过索引将字符串数组还原到原来的顺序, 详细还请看代码
实例代码
string[] RemoveSameElement(string[] source){ List<string> result = source.ToList(); result.Sort(); for(int i = 1; i < source.Length;) { if (result[i] == result[i - 1]) { result.RemoveAt(i); } else { i++; } } return result.ToArray();}string[] RemoveSameElement(string[] source){ Dictionary<int, StringInfo> d = new Dictionary<int, StringInfo>(); List<StringInfo> temp = new List<StringInfo>(); List<string> result = new List<string>(); for (int i = 0; i < source.Length; i++) { d.Add(i, new StringInfo(source[i])); temp.Add(d[i]); } temp.Sort(); for (int i = 0; i < temp.Count;) { if (temp[i] != null) { temp.RemoveAt(i); } else { i++; } } foreach(StringInfo i in temp) { result.Add(i.Value); } return result.ToArray();}// 通过这个StringInfo类来实现对string的引用class StringInfo : IComparable{ public StringInfo(string value) { Value = value; } public string Value; public int CompareTo(object obj) { if (obj.GetType() == GetType()) { return Value.CompareTo((obj as StringInfo).Value); } else { throw new ArgumentException("参数必须为StringInfo类型"); } }}End
1. 这个算法只是偶然间想到的, 不喜勿喷, 也请多多指教.
2. 算法作为一个功能嵌入到我的一个文本处理小工具中
- (对文本文件的每一行进行特定处理), 这个工具包含以下功能
- ‘在行首行末随机插入特定的内容’,
- ‘在行首行末依照自己定义好的一个字符串序列,按顺序一个个插入到行首或行末’,
- ‘以一定初值,一定增量, 在行首或行末插入数字’,
- ‘根据每一行的字符串长度排序’
- ‘根据每一行的字符串内容排序’
- ‘去除功能(去除空行,去除重复行, 去除行首行末指定字符,去除包含关键字的行 等等)’ … … … . .
想恰饭 (;´༎ຶД༎ຶ`)
- 上面所说的小工具是帮人代写的, 如果你需要它并且懒得写代码, 我很乐意将他出售给你. 之前没有排序功能的时候, 原售价是50¥ (老板给了这么多)
- 欲购买的话… 私聊就好 (虽然这的确是一个没有什么技术含量的东西)
数组去重: 超高速字符串去重 (含保留原顺序的方法)
https://slimenull.com/posts/20200627054332/