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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值