給定一個數組,判定該數組中是否有重復元素。
判定該數組中是否有重復元素總結出以下實現方案:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Demo { class Program { /** * 判定一個字符串中是否有重復的元素。 */ static void Main(string[] args) { string[] arr = new string[] { "1", "2", "3", "4", "3" }; bool isContainsSameItem = IsSameWithForeach(arr); Console.WriteLine(isContainsSameItem); isContainsSameItem = IsSameWithSortAndCompare(arr); Console.WriteLine(isContainsSameItem); isContainsSameItem = IsSameWithHashSet(arr); Console.WriteLine(isContainsSameItem); isContainsSameItem = IsSameWithArrayContains(arr); Console.WriteLine(isContainsSameItem); Console.ReadKey(); } /** * 利用array.contains存儲及判斷是否存在重復數據 * **/ static bool IsSameWithArrayContains(string[] arr) { var newArr = new string[arr.Length]; var idx = 0; foreach (var i in arr) { if (false == newArr.Contains(i)) { newArr[idx] = i; idx++; } else { return true; } } return false; } /** * 利用hasset的原理來實現 * **/ static bool IsSameWithHashSet(string[] arr) { ISet<string> set = new HashSet<string>(); for (var i = 0; i < arr.Length; i++) { // 這里可利用該元素來實現統計重復的原理有哪些,及重復個數。 //bool state = set.Add(arr[i]); // 如果返回false,表示set中已經有該元素。 //Console.WriteLine(state); set.Add(arr[i]); } return set.Count != arr.Length; } /** *排序后,比較相鄰的數據是否有重復的。 */ static bool IsSameWithSortAndCompare(string[] arr) { // 先排序 Array.Sort(arr); //Console.WriteLine(string.Join(",", arr)); // 對比相鄰的數據是否相同 for (var i = 0; i < arr.Length - 1; i++) { if (arr[i] == arr[i + 1]) return true; } return false; } /** * 雙層遍歷 */ static bool IsSameWithForeach(string[] arr) { for (var i = 0; i < arr.Length - 1; i++) { for (var j = i + 1; j < arr.Length; j++) { if (arr[i] == arr[j]) return true; } } return false; } } }
其中我個人覺得是:IsSameWithHashSet(string[] arr)效率最高。
測試性能,測試代碼:
1 string[] arr = new string[100000]; 2 // 給arr填充為一個沒有任何重復數據的數組來,測試性能。 3 for (var i = 0; i < arr.Length; i++) 4 { 5 arr[i] = i.ToString(); 6 } 7 8 System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); 9 watch.Start(); 10 bool isContainsSameItem = IsSameWithForeach(arr); 11 Console.WriteLine(isContainsSameItem); 12 watch.Stop(); 13 Console.WriteLine("IsSameWithForeach 耗時:" + watch.ElapsedMilliseconds + "milliseconds"); 14 15 watch = new System.Diagnostics.Stopwatch(); 16 watch.Start(); 17 isContainsSameItem = IsSameWithSortAndCompare(arr); 18 Console.WriteLine(isContainsSameItem); 19 watch.Stop(); 20 Console.WriteLine("IsSameWithSortAndCompare 耗時:" + watch.ElapsedMilliseconds + "milliseconds"); 21 22 watch = new System.Diagnostics.Stopwatch(); 23 watch.Start(); 24 isContainsSameItem = IsSameWithHashSet(arr); 25 Console.WriteLine(isContainsSameItem); 26 watch.Stop(); 27 Console.WriteLine("IsSameWithHashSet 耗時:" + watch.ElapsedMilliseconds + "milliseconds"); 28 29 watch = new System.Diagnostics.Stopwatch(); 30 watch.Start(); 31 isContainsSameItem = IsSameWithArrayContains(arr); 32 Console.WriteLine(isContainsSameItem); 33 watch.Stop(); 34 Console.WriteLine("IsSameWithArrayContains 耗時:" + watch.ElapsedMilliseconds + "milliseconds"); 35 36 Console.ReadKey();
測試效果: