c#:判斷一個數組元素中否有重復元素


給定一個數組,判定該數組中是否有重復元素。

判定該數組中是否有重復元素總結出以下實現方案:

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();

測試效果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM