这一节我们来学习第二种集合,因为它的特性,可以提供一种相当有效率的搜索方法,所以在实际项目中非常实用,它就是哈希表。哈希继承了IDictionary接口,IDictionary接口提供了key(键)/value(值)集合设计模式,这种类集合中的每个一个对象都包含一个与它相对应的key,可以通过所指定的key找到集合中所对应的对象(value值),这个接口最重要之处在于定义了公共属性Item、values、keys,其中Item根据指定的key返回集合中所对应的值,values用来返回集合中所有的对象元素,keys则返回集合中的所以key,现在你们就把key想象成存放值的“索引值”,通过这个“索引值”可以找到值。除了哈希表有这种键值对的访问机制外,下一节我们也将学习到一种SortList 类,它是键/值条目和一个ArrayList集合的组合体,实现了二元搜索,性能更加强大。接下来,我们就来理解一下什么是键值对的访问机制,同时利用实例理解哈希与HashTable类。

哈希提供了一种类似字典的数据结构,原理是通过哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。将集合中元素的key值经过哈希函数转换成对应表格中的索引值,该类的表格称为哈希表,通过哈希函数的使用,键值对应到一个称为哈希码的值,再通过这个哈希码形成的索引地址,找到指定的对象元素即value值。下面我们来看一下哈希的知识要点:

哈希表是键/值对的集合 ,这些键值对根据键的哈希代码进行组织,根据键可以查找到相应的值。

这个要点我就不再解释了,你们要记住的是,对哈希的操作内部机制实质上都是对键的操作。

键不能为空或重复,value值可以。键、值可以为任意数据类型。

因为是对键的操作,所以就要求key值的唯一性,同时任何数据类型都可以存放在哈希表中,而且对键值对的操作也是严格根据其数据类型进行的。比如key值是整型1和字符串类型的1,所查找的value值的索引地址是不同的,这一点必须严格执行。

动态存放键/值对,容量根据实际需要自动增加。

HashTable类所创建的集合对象,容量也是依据需要而自动增加的,它的扩充会比ArrayList更加科学,不会成倍增长,而是根据加载因子来决定,这个因子决定集合在填充多少元素时,才继续扩充其容量。

定义哈希表对象的语法是Hashtable hstb = new Hashtable( );

常用的属性
       hstb.Count哈希表中键值对的元素个数 ,这两种的用法和ArrayList相同,我们着重理解的是下面两个HashTable类的属性:

hstb.keys取得集合中的键值集合; hstb. Values返回相对的数值集合对象。这两个都是根据对象的元素得来的,是只读属性,无法修改它们的结果。
常用方法
增加元素-在增加哈希表元素的时候,有两种方式,第一种是hstb.Add(key,value)一定要键值对的形式同时增加用“,”隔开第二种是通过键获取值的形式添  加,同时这种格式也可以修改指定的键中的值,然后存储在哈希对象hstb中,格式是hstb[key]=value;应注意键和值的数据类型。            
删除元素-删除元素用两种hstb.Clear();全部删除,第二种是根据键删除元素hstb.Remove(key);
查找元素- hstb. Contains(key)、 hstb.ContainsKey(key)查看是否包含指定的键,
               hstb.ContainsValue(Value)是否包含指定的值,返回的都是true或false,体现查询结果。

遍历元素-遍历有两种形式,第一种:哈希的元素是一个键值对,DictionaryEntry类型是一个键值对的集合,使用这个类型的对象来进行遍历hstb对象

如: foreach (DictionaryEntry  jzd  in  hstb ) 遍历出的对象是一个哈希的键值对,然后利用jzd .Key取得键 ,jzd .Value取得值。

第二种遍历是遍历出keys或Values的集合的每个键或值,如   foreach( object k in hstb .Keys  )或foreach( object v in hstb .Values  )

                注意:因为键或值的数据类型可以为任意类型,所以遍历出集合后,存放键或值的变量的数据类型最好为object型,此类型包含任何一个类型。

在哈希类中,一定的按照键的数据类型和键值的排列原则,这就决定了无法对元素进行排序,因此我们不能通过特定顺序取得指定的元素。下面我们通过几个例子和结果给大家形象的演示一下哈希表的属性和方法的使用。

 1            Hashtable hstb = new Hashtable();
 2            Console.WriteLine("正在给hstb集合增加元素!请注意键和值的数据类型!");      
 3            hstb.Add(1, 11);                                               //值的类型是整数型
 4            hstb.Add("1", "我的键是字符串1");
 5            hstb.Add(5, "我的键是整型5,比你们大,应该先显示");
 6            hstb[3] = "我是用获取方式赋值的";
 7            Console.WriteLine("hstb集合增加{0}个元素!",hstb .Count);
 8
 9            Console.WriteLine("使用遍历出键值对变量方法,结果如下:");
10
11            Console.WriteLine("\t键\t值");
12            foreach (DictionaryEntry jzd in hstb)   
13            {
14                Console.WriteLine("\t{0}\t{1}", jzd.Key, jzd.Value);
15            }
16

运行结果如下正在给hstb集合增加元素!请注意键和值的数据类型!
hstb集合增加4个元素!
使用遍历出键值对变量方法,结果如下:
        键      值
        5       我的键是整型5,比你们大,应该先显示
        3       我是用获取方式赋值的
        1       我的键是“1”
        1       11
请按任意键继续. . .

接下来我们接着上面的例子加入以下代码演示一下修改键值为3的元素值,然后利用键集合遍历出键和值。

            Console.WriteLine("正在修改键为3的元素值!");
            hstb[3] = "获取方式也可以修改你的值,哈哈!";
            Console.WriteLine("使用键集合遍历出键和值");
            Console.WriteLine("\t键\t值");
            foreach (object k in hstb.Keys)
            {
                Console.WriteLine("\t{0}\t{1}", k, hstb[k]);
            }

遍历出k后,k存放的是元素的键,再通过键获取值。

运行结果对比如下:

运行结果对比如下:正在给hstb集合增加元素!请注意键和值的数据类型!
hstb集合增加4个元素!
使用遍历出键值对变量方法,结果如下:
        键      值
        5       我的键是整型5,比你们大,应该先显示
        3       我是用获取方式赋值的
        1       我的键是“1”
        1       11
正在修改键为3的元素值!
使用键集合遍历出键和值
        键      值
        5       我的键是整型5,比你们大,应该先显示
        3       获取方式也可以修改你的值,哈哈!
        1       我的键是“1”
        1       11
请按任意键继续. . .

看一下 键为3的元素值被修改了,接下来,我们演示按照键删除元素,再使用值集合遍历出元素值,注意:这种遍历是得不到元素键的值的,原因就是哈希代码是按照键进行组织的,我们现在接着在上面的例子中加入如下代码:

Code
            Console.WriteLine("正在删除键为整型1的元素");
            hstb.Remove(1);    //删除键=1的元素
            Console.WriteLine("使用值的集合遍历哈希");
            Console.WriteLine("\t键\t值");
            foreach (object v in hstb.Values )
            {
                Console.WriteLine("\t \t{0}", v);
            }

运行结果将只截取上部分代码进行对比。正在修改键为3的元素值!
使用键集合遍历出键和值
        键      值
        5       我的键是整型5,比你们大,应该先显示
        3       获取方式也可以修改你的值,哈哈!
        1       我的键是“1”
        1       11
正在删除键为整型1的元素
使用值的集合遍历哈希
        键      值
                我的键是整型5,比你们大,应该先显示
                获取方式也可以修改你的值,哈哈!
                我的键是“1”
请按任意键继续. . .

通过下面的例子,相信对它的使用你们已经熟悉了,下面我留一道作业题运行结果如图:

利用哈希表建立一个学员管理系统欢迎进入0122班学员登记系统
========================================
请选择如下操作
A:添加  B:查询  C:删除  D:修改  E:退出系统
a
请输入学号为:1
请输入学生的姓名:唐老鸭
*******************************
请选择如下操作
A:添加  B:查询  C:删除  D:修改  E:退出系统
a
请输入学号为:2
请输入学生的姓名:蜡笔小新
*******************************
请选择如下操作
A:添加  B:查询  C:删除  D:修改  E:退出系统
b
按学号查找请选A,按姓名查找请选B
a
请输入要查询的学号:
1
学生姓名为:唐老鸭
A:继续查询   B:退出查询
b
========================================
请选择如下操作
A:添加  B:查询  C:删除  D:修改  E:退出系统
d

这个作业比较简单,学号用键来存放,值存放的是一个变量姓名,正常情况下,值会以一个数组或动态数组的形式存放更多的信息,如:年龄、联系方式等,然后通过Value值中数组的索引查找单个信息,实现修改等操作,同时这种用法也是实际项目中的常用做法,比如网上商城,增加一条商品信息,常会采用哈希表来实现功能。下一节我们要来学习二元搜索和sortlist类。

转载于:https://www.cnblogs.com/wangfang224120999/archive/2008/10/15/1309635.html

(教学思路 C#集合二)哈希表相关推荐

  1. 数据结构与算法 学习笔记(8):字典、集合、哈希表

    数据结构与算法 学习笔记(8):字典.集合.哈希表 本次文章记录的是和字典.集合.哈希表等数据结构相关的LeetCode算法题(题号与LeetCode对应),包括其构造和使用,针对每一题或一类题给出了 ...

  2. 制作销售属性的组合的集合为哈希表,根据用户点击的属性组合判断某个skuId并跳转到对应的页面

    一.查询spu系列商品: 1.查询spu系列商品中所有属性值之间的组合(一个组合,即一个sku商品)!!! 这里的数据苹果11 颜色:黑色.白色.红色: 版本:128G.256G: 总共6种组合: S ...

  3. 【C#】集合_哈希表_字典_泛型_文件

    数组能做到:存放同种类型数据,且数据个数确定 object类型的数组能满足:放各种类型的数据,确定放多少个,但是随意插入元素,数组做不到 集合能做到:存放各种数据类型,且不确定存放多少个,能做到随意插 ...

  4. C#中的集合、哈希表、泛型集合、字典

    集合ArrayList 集合:集合可以看做是数组,可以将其看成"长度可变,具有很多方法的数组".使用ArrayList,首先需要导入命名空间using.system.collect ...

  5. 【Java】列表、集合、哈希表和可变参数

    1 List 1.1 List的特点 List接口继承自Collection接口 List是有序集合,存取顺序一致 允许存储重复元素 1.2 List的特有方法[带索引] public void ad ...

  6. python 字典 哈希_Python 字典和集合基于哈希表实现

    哈希表作为基础数据结构我不多说,有兴趣的可以百度,或者等我出一篇博客来细谈哈希表.我这里就简单讲讲:哈希表不过就是一个定长数组,元素找位置,遇到哈希冲突则利用 hash 算法解决找另一个位置,如果数组 ...

  7. (教学思路 C#之类二)类成员:属性

    属性     上节课我把属性形容成是一个进入房间的窗户或通道,关闭着的房间就是封装好的类,那么属性用代码要如何解释呢?其实这个问题,在我刚学习属性时也是很不理解,如果需要对字段的值进行判断,就写我上面 ...

  8. JavaScript 数据结构与算法(二)哈希表

    本文参考文献:https://www.cnblogs.com/AhuntSun-blog/p/12636718.html 配套视频教程:https://www.bilibili.com/video/B ...

  9. (教学思路 c#之类一)声明类和对象、定义类成员及其引用

    上一节(教学思路 c#之面向对象二)初步理解面向对象的基本概念中,我没有提到任何的代码,只是用语言和实例来说明什么是类和对象以及面向对象的特性等基本概念,类是c#程序语言的重要核心,也是构建应用程序最 ...

最新文章

  1. 增大减小LV大小和文件系统
  2. E0070 不允许使用不完整的类型
  3. STM32用keil5调试程序出现 Error:Flash Download Failed-Cortex-M3解决方案
  4. adaboost算法java代码_04-04 AdaBoost算法代码(鸢尾花分类)
  5. JNI----Native本地方法接口
  6. 从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案...
  7. Flask werkzeug 源码解析
  8. case class和trait
  9. 1024程序员节再次引爆星城!千万程序员线上线下互动,共迎新程序员时代
  10. python基本代码教程-Python入门教程丨1300多行代码,让你轻松掌握基础知识点
  11. Jdk1.6 JUC源码解析(12)-ArrayBlockingQueue
  12. python 读grid 数据_jqGrid获取到python返回的Json数据,未能显示到页面上,为毛???...
  13. 软考高级软件架构师论文——论软件架构风格
  14. 重磅!!毕业将近,论文免费查重工具任你选,非常值得收藏!
  15. pta 7-1 走楼梯升级版(递归)
  16. DDD专题之--入门
  17. 必备收藏!9种工具让开发员工作更高效、生活更轻松
  18. 帧同步游戏开发基础指南
  19. java中的相对路径和绝对路径,获取一个文本上每个字符出现的次数
  20. Code Review Checklist

热门文章

  1. 矩阵行列式的几何意义验证
  2. 前端Javascript与Nodejs的异同
  3. 大话数据结构18:最小生成树算法
  4. 7.4.8 数据压缩
  5. 开源大数据周刊-第102期
  6. 这一次,吃透你项目中的每个资源!
  7. Node.js使用fs.renameSync报cross-device link not permitted错误
  8. iOS 商城类 app 首页的实现
  9. jquery 中 fn.apply(this, arguments)是什么函数?有什么作用?能举个例子吗
  10. CALayer与UIBezierPath