HashSet 集合 去重
阿新 • • 發佈:2019-02-08
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(); } } }