《数组与集合学习.pptx》由会员分享,可在线阅读,更多相关《数组与集合学习.pptx(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、16.1 一维数组6.1.1 一维数组的创建及初始化一维数组的声明与分配语句的语法形式:数据类型 数组名=new 数据类型符长度;或者:数据类型 数组名;数组名=new 数据类型符长度;示例:double score=new double300;或者:double score;score=new double 300;第1页/共40页26.1.1 一维数组的创建及初始化 为数组元素赋初值的语法形式:数据类型符 数组名=初值列表;或者:数据类型符 数组名=new 数据类型符 初值列表;示例:int x=1,2,3,4;int x=new int 1,2,3,4;第2页/共40页36.1.2 一维
2、数组的简单应用示例:double aver=0.0;double score=new double300;for(int i=0;i300;i+)scorei=i;for(int j=0;j 300;j+)aver=aver+scorej;aver=aver/300;第3页/共40页46.2 二维数组6.2.1 二维数组的创建及初始化二维数组的定义与分配语法形式:数据类型符,数组名=new数据类型符长度1,长度2;或者数据类型符,数组名;数组名=new 数据类型符 长度1,长度2;示例:int,a=new int 3,4;或者 int,a;a=new int 3,4;/为数组分配存储空间 第4
3、页/共40页56.2.1 二维数组的创建及初始化为数组元素赋初值的语法形式:数据类型符 ,数组名=new int,初始列表1,初始列表2,初始列表n;或者数据类型符 ,数组名=初始列表1,初始列表2,初始列表n;示例:int,a=new int,1,2,3,4,5,6;或者:int,a=1,2,3,4,5,6;第5页/共40页66.2.2 二维数组的简单应用示例:某班有M名同学,本学期开了N门课,期末考试后,要统计每个学生的平均分,请编写程序代码实现该功能,要求对于每个学生要输入学号和N门课的成绩。static void Main(string args)const int M=2;const
4、 int N=2;int,score=new intM,N+1;int i,j;double aver=new doubleM;for(i=0;i M;i+)Console.WriteLine(请输入第0个人的学号和成绩:,i+1);score i,0=Convert.ToInt32(Console.ReadLine();for(j=1;j=N;j+)score i,j =Convert.ToInt32(Console.ReadLine();第6页/共40页76.2.2 二维数组的简单应用接上页for(i=0;i M;i+)averi=0;for(j=1;j=N;j+)averi=averi+
5、score i,j;averi=averi/N;for(i=0;i M;i+)Console.WriteLine();for(j=0;j=N;j+)Console.Write(0 ,score i,j);Console.Write(0 ,aver i);Console.Read();第7页/共40页86.3 交错数组 交错交错数组也属于多维数组,只是其每行的列数均不同。交错数组的定义一般分为两步,以二维数组为例。首先定义二维数组占用的行数,并分配行,然后定义每一个行数组行数组,并分配空间。第8页/共40页96.3.1 交错数组的创建及初始化分配行:数据类型符 数组名=new 数据类型符 行数;
6、示例:int b=new int 3;/定义具有3行的交错数组各行数组元素个数的分配:数组名i=new 数据类型符 长度;b0=new int 2;/首行具有两个元素 b1=new int 3;/第二行具有3个元素 b2=new int 4;/第三具有有4个元素第9页/共40页106.3.1 交错数组的创建及初始化交错数组可以在声明时进行初始化。示例:int a=new int new int 1,2,new int 3,4,5,new int 6,7,8,9;或者:int a=new int 1,2,new int 3,4,5,new int 6,7,8,9 ;第10页/共40页116.3.
7、2 交错数组的简单应用示例:编程输出杨辉三角的前五行。杨辉三角的前五行值如下。11 11 2 11 3 3 11 4 6 4 1第11页/共40页126.3.2 交错数组的简单应用static void Main(string args)const int M=5;int yhsj=new intM;int i,j;for(i=0;i 5;i+)yhsji=new inti+1;for(i=0;i M;i+)yhsji0=1;yhsjii =1;for(i=2;i 5;i+)for(j=1;j i;j+)yhsji j=yhsji-1 j-1+yhsji-1 j;for(i=0;i M;i+)
8、Console.WriteLine();for(j=0;j=i;j+)Console.Write(0 ,yhsj i j);第12页/共40页136.4 遍历数组6.4.1 使用for循环遍历 在遍历数组时,最常用的3种方式就是使用Array类提供的Length属性、GetUpperBound方法和GetLength方法。遍历一维数组 示例:int a=1,2,3,4,5,6;for(int i=0;i a.Length;i+)Console.Write(0,-4,ai);Console.Read();第13页/共40页146.4.1 使用for循环遍历示例:通过GetUpperBound方法
9、获取数组的最高下标。int a=1,2,3,4,5,6;for(int i=0;i a.GetUpperBound(0)+1;i+)Console.Write(0,-4,ai);Console.Read();注:GetUpperBound方法中的参数0表示0维,一维数组的维数就是0。第14页/共40页156.4.1 使用for循环遍历遍历二维数组示例:int,a=1,2,3,4,5,6;int n=a.Length;Console.WriteLine(一共有0个元素!,n);for(int i=0;i a.GetLength(0)+1;i+)Console.WriteLine();for(in
10、t j=0;j a.GetLength(1)+1;j+)Console.Write(0,-4,ai,j);Console.Read();第15页/共40页166.4.1 使用for循环遍历遍历交错数组 示例:int a=new int 2;a0=new int 1,2,3;a1=new int 4,5;int n=a.Length;Console.WriteLine(一共有0个元素!,n);for(int i=0;i a.Length;i+)Console.WriteLine();for(int j=0;j a i.Length;j+)Console.Write(0,-4,aij);Conso
11、le.Read();第16页/共40页17注意Array类的Length属性在二维数组和交错数组中的用法区别。第17页/共40页186.4.2 使用foreach遍历一维数组示例:int numbers=4,5,6,1,2,3,-1,-2,0;foreach(int i in numbers)Console.WriteLine(i);第18页/共40页196.4.2 使用foreach遍历二维数组示例:int,numbers=new int3,2 4,44,5,55,6,66;foreach(int i in numbers)Console.Write(0,-3 ,i);Console.Rea
12、d();第19页/共40页206.5 常用集合6.5.1 ArrayList类 ArrayList是一个集合,使用方法与Array类似,但Array是数组,有维数且大小固定,而ArrayList没有维数,大小不固定,故ArrayList又称为动态数组。常用属性:Count:获取动态数组中实际所包含的元素数Item:获取或设置指定索引处的元素Capacity:获取动态数组的容量大小第20页/共40页216.5.1 ArrayList类常用方法:Add、Remove、RemoveAt、Clear、Insert、IndexOf、Reverse、Sort、ToArray、Contains。示例:Arr
13、ayList li=new ArrayList(8);注意,这里的8指容容量量,容量与元素的个数是两个完全不同的概念,集合中的元素个数通过属性Count获取,而容量则是通过Capacity属性获取。容量总是大于或等于元素的个数。第21页/共40页226.5.1 ArrayList类示例:static void Main(string args)ArrayList Li=new ArrayList(2);Console.WriteLine(Li中的元素的个数为0,Li.Count);Console.WriteLine(Li中的容量为0,Li.Capacity);int arr=new int 1
14、0;Console.WriteLine(arr中的元素的个数为0,arr.Length);Console.Read();第22页/共40页23添加元素 Add方法,添加元素,自动添加到列表的末尾。示例:static void Main(string args)ArrayList Li=new ArrayList();Li.Add(a);Li.Add(nihao);Li.Add(1);for(int i=0;i Li.Count;i+)Console.Write(0,-4,Lii);Console.Read();第23页/共40页24插入元素ArrayList提供了一个用于插入操作的方法Inse
15、rt,该函数的语法形式如下:public void Insert(int index,Object value)示例:ArrayList Li=new ArrayList();string arr=new string wo,men,shi,peng,you ;Li.Add(a);Li.Add(nihao);Li.Add(1);Li.AddRange(arr);/注意与Li.Add(arr)的区别;Li.Add(21);Console.WriteLine(Li.Count);Console.WriteLine(Li.Capacity);Console.WriteLine(排序前的顺序为:);第
16、24页/共40页25插入元素代码接上页for(int i=0;i Li.Count;i+)Console.Write(0,-8,Lii);if(i+1)%5=0)Console.WriteLine();Li.Insert(0,hehe);Console.WriteLine();Console.WriteLine(插入后的顺序为:);for(int i=0;i Li.Count;i+)Console.Write(0,-8,Lii);if(i+1)%5=0)Console.WriteLine();Console.Read();第25页/共40页26删除元素对于ArrayList类的实例不再需要的元
17、素,可以通过Remove和RemoveAt删除。示例:static void Main(string args)ArrayList Li=new ArrayList();string arr=new string wo,men,shi,peng,nihao;Li.Add(a);Li.Add(nihao);Li.Add(1);Li.AddRange(arr);Li.Add(21);Console.WriteLine(排序前的顺序为:);第26页/共40页27删除元素代码接上页for(int i=0;i Li.Count;i+)Console.Write(0,-8,Lii);if(i+1)%5=0
18、)Console.WriteLine();Li.Remove(nihao);Console.WriteLine();Console.WriteLine(排序后的顺序为:);for(int i=0;i Li.Count;i+)Console.Write(0,-8,Lii);if(i+1)%5=0)Console.WriteLine();Console.Read();注意:Remove方法负责移除ArrayList对象的第一个匹配项RemoveAt的参数不是要删除的元素,而是其下标,例如RemoveAt(1)第27页/共40页28元素的排序Sort方法用于排序。示例:static void Mai
19、n(string args)ArrayList Li=new ArrayList();string arr=new string wo,men,shi,peng,you;Li.Add(a);Li.Add(nihao);Li.Add(1);Li.AddRange(arr);Li.Add(21);Console.WriteLine(排序前的顺序为:);第28页/共40页29元素排序 代码接上页 for(int i=0;i Li.Count;i+)Console.Write(0,-8,Lii);if(i+1)%5=0)Console.WriteLine();Li.Sort();Console.Wri
20、teLine();Console.WriteLine(排序后的顺序为:);for(int i=0;i Li.Count;i+)Console.Write(0,-8,Lii);if(i+1)%5=0)Console.WriteLine();Console.Read();注意:元素类型必须相同,否则排序会出错!第29页/共40页306.5.2 哈希表哈希表,是按照链表的形式进行存储的,不需要顺序排列,而ArrayList类是按照顺序进行排列的。对于链表存储的结构,需要通过索引进行访问。第30页/共40页31 Hashtable类表示哈希表,是一个键/值对的集合。常用属性:Keys,Values,C
21、ount。常用方法:Add、Remove、Clear、ContainKey、ContainValue 第31页/共40页326.5.2 哈希表示例:static void Main(string args)Hashtable ht=new Hashtable();ht.Add(001,number);ht.Add(002,grade);ht.Add(003,name);Console.WriteLine(输出ht的键/值的对数为:0,ht.Count);Console.WriteLine(请输入要查找的键:);string a=Console.ReadLine();if(ht.Contains
22、Key(a)Console.WriteLine(找到键0所对应的值1,a,hta);else Console.WriteLine(在ht中没有找到要查找的键0,a);ht.Remove(003);第32页/共40页336.5.2 哈希表 Console.WriteLine(请输入要查找的键:);string b=Console.ReadLine();Console.WriteLine(“键0所对应的值1在哈希表中”,b,ht.ContainsKey(b)?”包含”:”没有包含”);String value=“name”;Console.WriteLine(“值0所对应的键1在哈希表中”,val
23、ue,ht.ContainsValue(value)?”包含”:”没有包含”);Console.WriteLine(“在没有使用方法clear前输出ht的键/值的对数为:0”,ht.Count);ht.Clear();Console.WriteLine(“使用了clear方法后,输出的键/值的对数为:0”,ht.Count);Console.ReadLine();第33页/共40页34遍历哈希表遍历哈希表通过foreach语句来实现,有两种方式。一种是使用DictionaryEntry结构体访问Hashtable中的元素;另一种就是使用普通的类型作为只读变量,通过键的下标来访问。第34页/共4
24、0页35遍历哈希表使用DirectonaryEntry遍历哈希表 示例:static void Main(string args)Hashtable ht=new Hashtable();ht.Add(001,number);ht.Add(002,grade);ht.Add(003,name);ht.Add(004,age);ht.Add(005,sex);Console.WriteLine(输出ht的键/值的对数为:0,ht.Count);foreach(DictionaryEntry de in ht)Console.Write(0,-4,de.Key);Console.Write(0,-
25、4,de.Value);Console.WriteLine();Console.ReadLine();第35页/共40页36遍历哈希表通过键的下标遍历哈希表示例:static void Main(string args)Hashtable sh=new Hashtable();sh.Add(001,str1);sh.Add(002,str2);sh.Add(003,str3);Console.WriteLine(code string);foreach(string s in sh.Keys)Console.WriteLine(s+shs);Console.Read();第36页/共40页37
26、6.5.3 哈希表的排序由哈希表的遍历可以看出,哈希表并不是按照顺序输出的,而是随机的。对哈希表的排序定义为是对key(键)的排序。但是该定义并不能实现,因为无法直接在哈希表中对keys重新进行排序。因此,如果需要让哈希表按照某种规则来输出,可以采取一种变通的做法:将哈希表中的键值用属性Keys取出,并复制到ArrayList的实例中,然后对ArrayList的实例进行排序,最后把排序后ArrayList中键对应的值输出。第37页/共40页386.5.3 哈希表的排序示例:static void Main(string args)Hashtable ht=new Hashtable();ht.
27、Add(001,number);ht.Add(004,age);ht.Add(002,grade);ht.Add(005,sex);ht.Add(003,name);Console.WriteLine(输出ht的键/值的对数为:0,ht.Count);ArrayList akeys=new ArrayList(ht.Keys);akeys.Sort();foreach(string s in akeys)Console.Write(s+:);Console.WriteLine(hts);Console.ReadLine();第38页/共40页396.6 小结本章分别详细介绍了一维数组、多维数组和交错数组的创建、初始化以及遍历等。对于C#中的数组,必须明确指出其大小,当一个数组实例被创建时,每一维的标号和长度就被建立了。介绍了ArrayList类,该类可以按照需求动态增加空间容量,而且每次都是以当前空间的2倍进行扩展。由于ArrayList每次操作都要涉及大量数据的移动,不适宜进行频繁插入操作,所以提出了在内存中以链表形式存储的Hashtable,并介绍了相关使用方法。第39页/共40页40感谢您的观看。第40页/共40页
限制150内