本节我们通过数组的常用方法对数组进行操作,同时留几道数组的练习题复习数组。
数组的常用方法
上一节我提到了方法就是对象所具有的功能,一般是动词,比如抹布清除灰尘,清除就是它的功能,同样数组也有各种功能方法,比如清空、查找、排序等,这三个方法是本节的学习重点,我会逐一讲解。首先,我们来学习一下
数组的清空Array.Clear(Arrayname, int index, int length);
(操作的数组名,起始索引,清除元素的长度)
看下面的例子
int[] arr = new int[] {1,2,3,4,5};
foreach (int i in arr)
{
Console.WriteLine(i);
}
Array.Clear(arr, 1, 2);
Console.WriteLine(“从1号索引开始清除2个元素后的数组长度"+arr .Length );
foreach (int i in arr)
{
Console.Write(i+" ");
}
提问:同学们想一下结果输出是什么样子的?结果是:从1号索引开始清除2个元素后的数组长度5
1 0 0 4 5.
而不是1 4 5。原因是什么呢?这是由于数组的特性,数组的大小一旦初始化了就已经确定了,因此数组元素的清空只是将部分元素设置回了0、False或Null,这和数组元素的类型有关,但是数组的长度依然没有变化。
接下来我们来学习一下数组的查找
Array.IndexOf(Array,obj);查找arr数组中第一个出现obj元素的索引
Array.LastIndexOf(arr,obj);查arr找数组中最后一个出现obj元素的索引
int[] arr = new int[] { 3, 2, 1, 5, 2 ,4};
foreach (int i in arr)
{
Console.WriteLine(i);
}
int z=Array.IndexOf(arr, 2);
int j=Array.LastIndexOf(arr,2);
Console.Write("第一次出现2的索引位:"+z);
Console.WriteLine("最后一次出现2的索引位:" +j);
结果是 第一次出现2的索引位:1 最后一次出现2的索引位:4 结果与事实吻合,c#提供的Array.IndexOf和Array.LastIndexOf方法还提供了两种方法:
Array.IndexOf(Array,obj,beginIndex);开始查询的索引位。
Array.IndexOf(Array,obj,beginIndex,count);起始查询的索引位,索引往大的方向累加查询数。
Array.LastIndexOf(Array,obj,beginIndex);开始查询的索引位。
Array.LastIndexOf(Array,obj,beginIndex,count);起始查询的索引位,索引往小的方向累加查询数。
接着上面的例子
int b = Array.IndexOf(arr, 2, 1, 4);
int l = Array.LastIndexOf(arr,2,4,4);
Console.WriteLine("从1号索引位开始的往大的索引数4个元素中第一次出现2的索引位:" + b);
Console.WriteLine("从4号索引位开始的往小的索引数4个元素中最后一次出现2的索引位:" + l);
运行结果为:
利用索引查询在实际项目中经常会被使用,比如在网站中编写上传图片时需要判断上传文件的扩展名,就需要用到LastIndexOf("\\")在上传文件的路径中,查找出索引位后,利用截取方法(在今后的字符串处理章节中将学到)把文件路径中最后一个“\”后的扩展名截取下来,再判断是否为合法图片格式;还有在网页上显示新闻时,会用才第几个字以后用"……"代替,省略了其后的文字,也是用查找索引位来达到的,同学们一定要掌握这种方法。另外说到这同学们一定觉得疑惑,存储文件路径或新闻内容时一般是用string类型的变量,不是数组呀,怎么用到索引呢?我要告诉大家,string类型不是值类型,而是引用类型,可以把string类型的变量看出是char类型的数组,索引string类型的变量可以用到索引。
下面我们来学习一下数组的排序
在c语言中,排序是利用冒泡原理,这种排序非常的麻烦,而实际应用中会经常应用到数组的排序。C#就提供了用于排序的两种算法:
Array.Sort(arr);用于对一维Array对象中的元素由小到大默认进行排序
Array.Reverse(arr);反转一维arr
Array.Sort(arr,beginIndex,count);用于对一维Array对象部分中的元素进行排序,从beginIndex索引开始,操作count个元素
Array.Reverse(arr,beginIndex,count);反转一维arr或部分arr中元素的顺序,从beginIndex索引开始,操作count个元素
例: int[] arr = new int[] { 3, 1, 5, 4, 2 };
Console.WriteLine("原数组元素顺序:");
foreach (int i in arr)
{
Console.Write(i+" ");
}
Console.WriteLine("");
Array.Reverse(arr);
Console.WriteLine("反转数组元素:");
foreach (int i in arr)
{
Console.Write(i + " ");
}
Console.WriteLine("");
Array.Sort(arr);
Console.WriteLine("排序后的数组元素:");
foreach (int i in arr)
{
Console.Write(i + " ");
}
Console.WriteLine("");
Array.Reverse(arr, 2, 2);
Console.WriteLine("对数组中从第2索引位对2个元素进行逆序排序:");
foreach (int i in arr)
{
Console.Write(i + " ");
}
Console.WriteLine("");
Array.Sort (arr,2,2);
Console.WriteLine("对数组中从第2索引位对2个元素进行排序:");
foreach (int i in arr)
{
Console.Write(i + " ");
}
Console.WriteLine("");
结果如下
以上就是数组常用的方法,大家要熟练掌握,下面我通过几道问答题大家一起来回顾一下这3节有关数组的学习。
1.数组用来存储各种类型的数据,想一想数组中的数据内容有几种赋值方式?
答:初始化时可以赋值、根据索引进行赋值。
2.交错数组与一般规则的数组最大的差异是什么?如何遍历交错数组?
答:交错数组是每行中的列都不一定相同的二维数组,遍历元素时需要先变量出行,再在行中遍历出列。
3.声明一个存储A、B、C、D、E等5个英文的数组对象,将其取出合并输出如ABCDE。
4.创建一个二维数组,并且在控制台输出以下内容:
02 04 06
08 10 11
12 14 16
5.利用一个二维数组存储3名同学的语文成绩及数学成绩,提示用户输入学生编号,语文及数学成绩,并将结果显示给用户。并将语文不及格的学生学号显示出来,如果不存在语文不及格的学生,则显示“语文考试全部通过”。
int[,] cj=new int [3,3];
int i;
for (i = 0; i <3;i++ )
{
Console.Write("请输入第{0}位学生的学生编号:",i+1);
cj[i, 0] = Convert.ToInt32(Console.ReadLine());
Console.Write("请输入此学生的语文成绩:");
cj[i,1]=Convert .ToInt32 (Console.ReadLine());
Console.Write("请输入此学生的数学成绩:");
cj[i,2]=Convert .ToInt32 (Console.ReadLine());
Console.WriteLine("*********************************");
}
for (i = 0; i <3;i++)
{
Console.WriteLine("请输出第{0}位学生的学生编号:{1},语文成绩:{2},数学成绩:{3}", i + 1, cj[i,0], cj[i,1], cj[i,2]);
}
Console.WriteLine("*********************************");
bool bj = false ;
i = 0;
while (i < 3)
{
if (cj[i, 1] < 60)
{
Console.WriteLine("不及格学生的学号为:{0}", cj[i, 0]);
bj = true;
}
i++;
}
if (bj != true)
{
Console.WriteLine("语文成绩全部及格!");
}
现在的程序有个问题,就是学号允许重复,而且代码有点多,主要是让你们看了简明扼要,以后再学习哈希表时可以有效的避免这个问题。下一节我们就学习一下动态数组。