1. 程式人生 > >HashSet 集合 去重

HashSet 集合 去重

1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            

            //--------陣列與雜湊表的概念與區別

            //陣列是程式語言提供的一種資料型別,即用一組連續的記憶體空間來存放資料,可以通過一個首地址,和一個數組下標,直接訪問這組記憶體空間中的任意位置。
            //雜湊表是資料結構這門學科中的概念,是以陣列為儲存方式,實現的一種可以快速查詢資料的資料結構。它是將資料的值通過一個對映函式,求出一個結果,然後把資料放在這個結果對應的陣列下標的位置。

            //陣列和雜湊表的共同點就是都是以陣列為基本儲存形式,不同點是,前者是程式設計上的概念,後者是資料結構上的概念。


            //----------------------------------------使用

            //利用HashSet去重
            //為什麼HashSet能去重? 因為HashSet集合的資料結構是雜湊表,所以儲存元素的時候,使用元素的HashCode方法來確定元素儲存的位置,如果位置相同,再通過equals來確定兩個元素是否為相同元素,如果是相同元素則不儲存,如果不是相同元素則儲存(注意,看起來一樣的兩個物件,他們的Equals是不同的)

            //-------儲存定位原理

            //上面說得到HashSet集合使用元素的HashCode方法來確定元素的儲存位置,我現在就來搞清楚它的原理!
            //假設一個數組arr的長度為15,即表示它能儲存15個元素,那現在我想將一個“ab”的字串儲存到這個數組裡面去,那這個“ab”具體儲存陣列的什麼地方呢? 答案是:根據一套演算法計算出來這個“ab”應該儲存在陣列的哪個位置。演算法怎麼算呢? 答案是:首先獲取到a這個字元的ASCII碼,得到97,然後獲取b這個字元的ASCII碼,得到98,然後將這兩個數相加,因為這個素組長度為15,那麼就將這個相加的數除以15求餘。 (97+98)%15=0,所以計算得出這個“ab”字串應該儲存在陣列的第一個位置,即arr[0]的位置
            //那麼HashSet在取資料的時候就非常快了,它根本就不需要去遍歷這個陣列。假設我想知道陣列中是否有一個“ab”的值,然後我根據以上的演算法,計算一下這個“ab”具體應該存在陣列的哪個位置,如果計算到這個“ab”就儲存在arr[0]的位置,那麼我就只要直接去取arr[0]就可以了,如果能取到值,則表示“ab”這個字串存在,否則不存在。

            //--------HashSet去重原理。

            //上面已經“ab”這個字串儲存在HashSet中去了,現在我又來了一個“ab”字串,想將它儲存到HashSet中去,然後就根據上面的那套演算法算出“ab”應該儲存在arr[0]的位置上去,這時候發現arr[0]上面已經有一個數據了,這時候就將已經存在的這個資料與準備存進來的“ab”進行Equals比較。"ab".Equals("ab"); 結果為true。於是HashSet就認定他們兩個是同一個元素,於是準備儲存進來的這個“ab”字串被丟棄,不讓它儲存。這樣就實現了HashSet去重的效果。



            int[] arr = new int[] { 1, 9, 2, 3, 4, 1, 3, 8 }; //下面利用HashSet的特性為arr裡面的元素去重,原理就是將arr的元素儲存到HashSet物件中。

            HashSet<int> hs = new HashSet<int>();

            int dd = (97 + 110) % 15;

            for (int i = 0; i < arr.Count(); i++)
            {
                hs.Add(arr[i]);
            }

            foreach (var item in hs)
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }
}