C# 数组和集合

6.1 数组概述

数组从字面上理解就是存放一组数,但在 C# 语言中数组存放的并不一定是数字,也可以是 其他数据类型。

数组的特点:

1.在一个数组中存放的值都是同一数据类型的。

2.数组中某个指定的元素是通过索引来访问的。

3.所有的数组都是由连续的内存位置组成的。

4.数组从零开始建立索引,即数组索引从零开始。

6.2 一维数组的创建、一维数组的初始化、一维数组的使用

一维数组

一维数组在数组中最常用,即将一组值存放到一个数组中,并为其定义一个名称,通过数组中元素的位置来存取值。

定义一维数组的语法形式如下:

1 //定义数组

2 数据类型[] 数组名;

1 //初始化数组中的元素

2 数据类型[] 数组名 = new 数据类型[长度];

3 数据类型[] 数组名 = {值 1, 值 2, ...}

4 数据类型[] 数组名 = new 数据类型[长度]{值 1,值 2,...}

举例如下:

int[] i = {1,2,3,6,5,4,7,8,9 };

for (int i1 = 0; i1 < i.Length; i1++)

{

MessageBox.Show(i[i1].ToString());

}

6.3 多维数组的创建、多维数组的初始化、多维数组的使用

多维数组是指二维或二维以上的数组。一般我们最常用的是二维数组。

定义多维数组的语法形式如下。

1 //定义多维数组

2 数据类型[ , , ...] 数组名;

1 //创建多维数组并初始化

2 数据类型[ , , ...] 数组名 = new 数据类型[m,n,...] {{ , , ...},{ , , ...}};

从上面定义的语法可以看出,它与一维数组的定义非常类似,每多一个维度则定义时的[]中增加一个“,”。

存取数组中的值也是将下标用“,”隔开。

多维数组初始化:

int[,] arr = new int[2,2];//若不置顶初始值,那么每个元素编译器会提供默认值0

int[,] arr1 = new int[2, 2] { { 1, 1 }, {2,2 } };//若置顶初始值,那么每个元素都要指定

int[,] arr2 = new int[,] { { 1, 1 }, { 2, 2 } };//指定初始值后长度可以省略

举例如下:

for (int i2 = 0; i2< arr2.GetLength(0); i2++)

{

for (int i3 = 0; i3 < arr2.GetLength(1); i3++)

{

MessageBox.Show(arr2[i2,i3].ToString());

}

6.4 数组的基本操作

1. 遍历数组

foreach 循环用于列举出集合中所有的元素,foreach 语句中的表达式由关键字 in 隔开的两个项组成。

in 右边的项是集合名,in 左边的项是变量名,用来存放该集合中的每个元素。

该循环的运行过程如下:

每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号的整个表达式返回值为 true,foreach 块中的语句就能够执行。

一旦集合中的元素都已经被访问到,整个表达式的值为 false,控制流程就转到 foreach 块后面的执行语句。

具体的语法形式 如下:

1 foreach(数据类型 变量名 in 数组名

2 {

3 //语句块;

4 }

注意:foreach 语句仅能用于数组、字符串或集合类数据类型。

举例如下:使用foreach遍历上一节中的数组

foreach (var item in arr2)

{

MessageBox.Show(item.ToString());

}

2. 添加/删除数组元素

a) 添加

int count = 8;

int value = 10;

int index = 5;

int[] arr = new int[] { 5, 6, 7, 8, 9, 1, 2, 3, 0, 0, 0, 0, 0 };

if (arr.Length == count)//判断数组长度是否等于8

{

int[] brr = new int[arr.Length * 2];//如果等于8,那么创建一个新数组,长度是原数组的二倍

for (int i = 0; i < arr.Length; i++)//遍历数组将数值传入新数组

{

brr[i] = arr[i];

}

arr = brr;//将新的数组传给旧数组 使得就数组变长

}

//7 5 --

for (int j = count - 1; j >= index; j--)//

{

arr[j + 1] = arr[j]; //将arr索引7的值给索引8

} //将arr索引6的值给索引7

//将arr索引5的值给索引6

arr[index] = value; //将value值10赋给arr数组索引5的值

}

b) 删除

int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

if (count - 1 == index)

{

count--;

}

else

{

for (int j = index + 1; j < arr1.Length; j++)//j初始值5 小于等于10 只有五个值

{

arr[j - 1] = arr[j]; //用索引5的值赋给索引4的值 相当于删除索引4的值

}

count--;

}

3. 对数组进行排序

a) 快速排序法(利用由CLR提供的算法自动升序排序)

Array.Sort(arr); //由CLR提供的算法

for (int i = 0; i < arr.Length; i++)

{

MessageBox.Show(arr[i].ToString());

}

b) 冒泡排序法,定义双层循环,依次遍历(时间复杂度为n2,空间复杂度为n2)

for (int j = 0; j < arr.Length - 1; j++)

{

for (int i = 0; i < arr.Length - 1; i++)

{

if (arr[i] > arr[i + 1])

{

int temp = arr[i];//互相置换

arr[i] = arr[i + 1];

arr[i + 1] = temp;

}

}

}

for (int i = 0; i < arr.Length; i++)

{

Console.Write(arr[i] + " ");

}

4. 数组的合并与拆分

合并:

int[] arr3 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

int[] arr4 = new int[] { 11, 21, 31, 14, 51, 61, 17, 18, 19, 10 };

int[] result = new int[arr3.Length + arr4.Length];

arr3.CopyTo(result, 0);

arr4.CopyTo(result, arr3.Length);

for (int i = 0; i < result.Length; i++)

{

MessageBox.Show("result数组值:" + result[i].ToString());

}

拆分:

int[] result1 = new int[arr4.Length /2];

int[] result2 = new int[arr4.Length / 2];

for (int i = 0; i < arr4.Length; i++)

{

if (i<=4)

{

result1[i] = arr4[i];

MessageBox.Show("result1索引:"+i+"的值为:"+result1[i]);

}

else

{

result2[i-5] = arr4[i];

MessageBox.Show("result2索引:" + i + "的值为:" + result2[i-5]);

}

}

6.5 ArrayList 类

1) ArrayList 类概述

a) 它表示可以单独编制索引的对象的有序集合。它基本上是一个数组的替代品。但是,与数组不同,可以使用索引来从列表中指定位置添加和删除项目,并且数组自动调整大小。它还允许动态内存分配,添加,搜索和排序列表中的项目。

2) ArrayList元素的添加

有两种方法可用于向ArrayList添加元素:Add和AddRange。

—Add方法将单个元素添加到列表的尾部。

—AddRange方法获取一个实现ICollection接口的集合实例,例如Array、Queue、Stack等,并将这个集合实例按顺序添加到列表的尾部。

ArrayList定义的Add方法语法如下:

public int Add(object value);

//参数:value:需要添加到ArrayList中的值。

参数value是添加的元素,这些元素不管什么数据类型,都会被转换为Object类型后保存。此方法返回值为整型数据,用于返回添加元素索引,添加的元素将插入ArrayList集合的末尾处。

AddRange方法可以一次添加几个元素。此方法定义语法如下:

public void AddRange(objcet[] value);

可以理解为添加一个Objcet类型的数组到ArrayList中。

注意:ArrayList接受null值并且允许元素重复。

下面代码演示了如何添加集合元素。

ArrayList arr = new ArrayList(20);

//使用ArrayList的Add方法添加集合元素

arr.Add("我是元素一");

arr.Add("我是元素二");

arr.Add("我是元素三");

arr.Add("我是元素四");

string[] strs = { "我是元素五", "我是元素六", "我是元素七", "我是元素八" };

//使用AddRange方法添加实现了ICollections接口的集,并按集合参数中元素的顺序添加

arr.AddRange(strs);

foreach (string str in arr)

{

MessageBox.Show(str);

}

3) ArrayList 元素的删除

ArrayList类中元素的删除有以下四种方法:

1.ArrayList变量名.Remove(要删除的值);

arr.Remove("我是元素四");

foreach (string str in arr)

{

MessageBox.Show(str);

2.ArrayList变量名.RemoveAt(索引值);

arr.RemoveAt(0);

foreach (string str in arr)

{

MessageBox.Show(str);

}

3.ArrayList变量名.RemoveRange(开始索引值,要删除的个数);

arr.RemoveRange(0, 3);

foreach (string str in arr)

{

MessageBox.Show(str);

}

4.ArrayList变量名.Clear(); //清空。

arr.Clear();

foreach (string str in arr)

{

MessageBox.Show(str);

}

4) ArrayList 的遍历与元素查找

/*

思路:

1:创建集合对象

2:往集合中添加字符串对象

3:遍历集合,首先要能够获取到集合中的每一个元素,这个通过get(int index)方法实现

4:遍历集合,其次要能够获取到集合的长度,这个通过size()方法实现

5:遍历集合的通用格式

*/

public class ArrayListTest01 {

public static void main(String[] args) {

//创建集合对象

ArrayList<String> array = new ArrayList<String>();

//往集合中添加字符串对象

array.add("刘正风");

array.add("左冷禅");

array.add("风清扬");

//遍历集合,其次要能够获取到集合的长度,这个通过size()方法实现

// System.out.println(array.size());

//遍历集合的通用格式

for(int i=0; i<array.size(); i++) {

String s = array.get(i);

System.out.println(s);

}

}

}

遍历:

foreach语句,object类型

object:ArrayList中存储的类型不一定一支,也不一定能够完全转换,所以为了避免出错,我们采用object类型。

//创建集合对象

ArrayList array = new ArrayList(10);

//往集合中添加字符串对象

array.Add("张三");

array.Add("李四");

array.Add("王五");

//遍历集合,其次要能够获取到集合的长度,这个通过size()方法实现

// System.out.println(array.size());

//遍历集合的通用格式

foreach (string str in array)

{

MessageBox.Show(str);

}

//元素的查找

//有三个方法

//在集合中查找字符串

//1.IndexOf(要查找的元素),返回一个索引整数值,如果查找不到,返回-1

MessageBox.Show(array.IndexOf("王五").ToString());

//2.LastIndexOf(要查找的元素)返回一个最后一次出现的索引整型值,否则,返回-1

MessageBox.Show(array.LastIndexOf("张三").ToString());

//3.BinarySearch();查找不到,返回-1 数据类型过多会报异常。

MessageBox.Show(array.BinarySearch("李四").ToString());

全部评论

相关推荐

喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务