您的位置:首页 > 其它

HashSet 集合 去重

2016-04-16 15:18 267 查看
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: