23. 数组

Posted LiuChangwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23. 数组相关的知识,希望对你有一定的参考价值。

1、数组定义

(1)什么是数组?

  数组简单来说就是连续的多个变量的集中定义。

(2)为什么要定义数组?

  数组用来解决多个变量定义的问,如几千几万变量无法一个一个去定义,这时就需要定义数组。

如下:给出多个数值,求最大值问题

 1             //给出多个数值求最大值
 2             int[] array = { 5, 45, 8, 7, 42 };
 3             int maxNum = 0;
 4             for (int i = 0; i < array.Length ; i++)
 5             {
 6                 if (array [i ]>maxNum )
 7                 {
 8                     maxNum = array[i];
 9                 }
10             }
11             Console.WriteLine(maxNum );
12             Console.ReadKey();

  数组存储方式:在内存中,数组存储在连续的区域内部,因为数组中每个元素的类型相同,所有占用的内存大小也一致。所以在访问数组中的元素时可以直接根据数组在内存中的起始位置及下标来计算元素的位置。数组的下标也称为索引,是从0开始的,最大索引是数组的元素总数据减1。数组元素可以为任何数据类型,在初始化数组时必须指定数组长度。

2、、一维数组的声明:

  以线性方式存储固定数目的数组元素,他只需一个索引值即可标识任意一个数组元素。

  声明格式数据类型  []  数组名称;

  初始化:

    (1)数组的大小一定是一个常量;

    (2)数组元素值已知时, 用字面值声明;元素值未知时,用new关键字;

    (3)数组大小与总数个数一致,否则编译失败;

    (4)组在初始化时必须指定一个长度给他,声明的时候则不需要。

 1             //已知变量值的数组声明及初始化
 2             int[] myintArray = { 0, 2, 4, 6, 8 };
 3 
 4             //未知数组各元素的值的声明及初始化
 5             string[] mystringArray;//声明
 6             mystringArray = new string[100];  //初始化
 7             //或者
 8             string[] mystringArray1 = new string[100];
 9 
10             //元素个数与数组长度必须一一对应
11             const int a = 3;                  //利用const将a定义为常量
12             string[] nameArray = new string[a] { "张三","李四", "王八" };

3、一维数组的使用:

  一维数组遍历时应该尽量使用foreach语句,因为他会自动检查数组的索引,使其不会出现越界值。

            //例:   
            int[] myintArray = { 0, 2, 4, 6, 8, 10 };

            //输出数组中的元素
            Console.WriteLine(myintArray[3]);     //这里的3指索引值

            //给数组元素重新赋值
            myintArray[3] = 100;
            Console.WriteLine(myintArray[3]);

            //利用for循环遍历数组中的元素
            for (int i = 0; i < 6; i++)
            {
                Console.WriteLine(myintArray[i ]);
            }

            //利用foreach遍历
            foreach(int myint in myintArray)
                Console.WriteLine(myint);
            Console.ReadKey();

 

4、二维数组

  遍历时几维数组就需要几个for循环语句嵌套,而利用foreach与则只需要一个。但是foreach语句不能控制整体元素的输出行列。

  格式:数据类型 [,] 数组名称;   
  //如果[,,]是两个逗号,则是三维数组。如:string [,,] mystrArray =new string [3,2,2];
  //我们可以将[3,2,2]简单理解为 三个二维数组,这个二维数组由2行2列构成。

            //例:    
            //已知二维数组元素的声明及初始化
            string[,] frend= { { "张三", "" }, { "李四", "" }, { "王八", "" } };

            //未知二维数组元素的声明及初始化
            string[,] frend1 = new string[3, 2];    //[3,2]三行二列
            string [,]frent2=new string [3,2] { { "张三", "" }, { "李四", "" }, { "王八", "" } };

            //二维数组的输出
            Console.WriteLine(frent2[1,0]);

            //重新赋值
            frent2[1, 0] = "小朋友";
            Console.WriteLine(frent2[1,0]);

            //利用for 语句遍历:以下是正序输出
            for (int i = 0; i < 3; i++)//
            {
                for (int j = 0; j < 2; j++)//
                {
                    Console.Write(frent2[i,j]+" \t");
                }
                Console.WriteLine();//输出列以后换行
            }


            //以下是倒序输出
            Console.WriteLine("以下是倒序输出:");
            for (int i = 2; i >= 0; i--)
            {
                for (int j = 1; j >= 0; j--)
                {
                    Console.Write(frent2[i,j ]+"\t");
                }
                Console.WriteLine();
            }           

            //利用foreach语句遍历
            foreach (string frent3 in frent2)
            {
                Console.Write(frent3+"\t");                
            }      
            Console.ReadKey();

 

5、二维数组的属性

            //例:   
            string [,]frent2=new string [3,2] { { "张三", "" }, { "李四", "" }, { "王八", "" } };

            //Length这个属性输出数组包含元素的总个数
            Console.WriteLine(frent2.Length);

            //GetLowerBound这个属性输出指定维度的下限,如(1)则输出列的下限为0
            Console.WriteLine(frent2.GetLowerBound(1));

            //GetUpperBound这个属性输出指定维度的上限,如果(0)则输出行的上限为2
            Console.WriteLine(frent2.GetUpperBound(0));    
            Console.ReadKey();

 

查找数组元素:注意他与字符串查找的区别,查找数组是Array.IndexOf()

            //例:   
            int[] intArray = { 1, 2, 3, 45, 46, 23, 15, 9, 8, 7, 4, 5, 55, 45, 2, 11 };
            int result;
            //Array.IndexOf(参数1,参数2):参数1是我们要查找的数组,参数2是要查找的元素
            //result = Array.IndexOf(intArray, 99);//如果元素不存在,则返回一个负数-1
            result = Array.LastIndexOf(intArray, 45);
            Console.WriteLine(result);

            //BinarySearch方法采用的是二分法,该方法的查找速度比IndexOf快
            int result1 = Array.BinarySearch(intArray, 10002);//用于查找首次出现的索引值,如果不存在该元素则返回一个负数-17
            Console.WriteLine(result1);

            //Array的Contains(是否包含某个元素)方法返回的是一个布尔值,该方法是对IList接口中方法的实现
            bool mybool;
            mybool = ((System.Collections.IList)intArray).Contains(15);
            Console.WriteLine(mybool);
            Console.ReadKey();

 

6、数组排序

  方法:Array.sort (要排序的数组);
     Array.Reverse (要排序的数组);
  该方法没有返回值,直接更改数组的排序。并且该方法只支持一维数组。

            //例:   
            int[] mystrArray = { 22, 565, 65, 6, 5, 5, 5, 656, 5, 4, 75, 4, 48, 45, 465, 8, 7, 26, 66 };
            //Array.Sort(mystrArray);
            //Console.WriteLine("实现数组升序输出:");
            //foreach(int outint in mystrArray)
            //    Console.Write(outint+"\t");
            
            //Array.Reverse(mystrArray);
            //Console.WriteLine();
            //Console.WriteLine("实现数组降序输出:");
            //foreach(int outint in mystrArray)
            //    Console.Write(outint+"\t");

            Array.Sort(mystrArray);
            for (int i=0;i < 19; i++)
            {
                Console.Write(mystrArray[i ] +"\t");
            }
            Console.ReadKey();

 

7、数组的合并与拆分

  数组的合并指的是将两个数组合并到第三个数组中,同样的数组的拆分需要声明一个新的数组用来存放从其他数组中复制出了的元素;
       Copy方法1:Array.Copy(源数组1,目标数组,要复制的长度);
       Copy方法2:Array.Copy(源数组2,从某个索引值开始复制,目标数组,从目标数组的某个索引值位置开始存放复制的长度,从源数组2中要复制的长度);

            //例:  
            int[] num1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
            int[] num2 = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
            Console.WriteLine("输出数组num1:");
            foreach (int ournum in num1) Console.Write(ournum+"\t");
            Console.WriteLine("输出数组num2:");
            foreach (int ournum in num2) Console.Write(ournum+"\t");
            //outnum 只在foreach语句中作用域,出了foreach语句相当于没有声明这个变量。所以能取与前一个foreach语句相同的名字
            //合并。。
            //声明一个新的数组用于接收数组1和2的元素
            int[] resultNum = new int[24];

            //接下来把数组1和2分别复制到resultNum中,实现数组的合并
            Console.WriteLine("合并后的结果:");

            //第一步
            Array.Copy(num1, resultNum, 10);
            //在数组num1中复制10个元素放到数组resultNum中。从索引值0开始依次复制
            //复制第二个数组时不能再用第一种重载方式Array.Copy(num2, resultNum, 10);,这样会覆盖第一次复制的元素

            //第二步
            //用第二种重载方式复制数组2
            Array.Copy(num2, 0, resultNum, 14, 10);
            //在num2中从索引值0开始复制10个长度,放入到resultNum中并从索引值14开始存放
            //没有存放数组元素的长度用0输出表示
            foreach (int outnum in resultNum) Console.Write(outnum+"\t");

            //拆分

            //再声明一个新的数组来实现数组的拆分
            int[] resultNum1 = new int[7];
            Console.WriteLine();
            Console.WriteLine("拆分后的结果:");
            Array.Copy(resultNum, 10, resultNum1, 0, 7);
            foreach (int outnum in resultNum1) Console.Write(outnum+"\t");
            Console.ReadKey();

 

8、ArrayList类元素的添加

  ArrayList(数组列表)类元素的添加:是一种更高级级的扩充的数组,被称为动态数组或者集合。

       使用步骤

           1)引入命名空间System.Collections;

           2) 创建实例

           3)引用对应的属性或方法

            //例:   
            ArrayList myArrayList = new ArrayList();
            //ArrayList的长度是不固定的,存储元素的类型随意
            //而一般数组的长度是固定的,不能更改的,类型单一,只能存储一种类型的数据

            Console.WriteLine("myArrayList初始化后的元素个数为:{0}",myArrayList.Count);//count用于获取ArrayList中包含的元素的个数

            //Add方法用于向ArrayList中添加单个元素,每次只能添加一个
            myArrayList.Add(124);
            myArrayList.Add(g);
            myArrayList.Add("mystring");
            myArrayList.Add(25.2);
            Console.WriteLine("使用Add方法向ArrayList类中添加元素之后,有{0}个元素",myArrayList.Count);

            //AddRange方法用于向ArrayList类中添加多个元素,可以是一个数组。如下
            string[] mystrArray = { "张三", "李四", "王八" };
            myArrayList.AddRange(mystrArray);
            foreach(object outelement in myArrayList)
                Console.Write(outelement+"\t");
            Console.ReadKey();

 

9、ArrayList类中元素的删除

  方法1、变量名.Remove(要删除的元素);

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

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

             4、变量名.Clear();//清除所有元素

            //例:   
            ArrayList myArrayList = new ArrayList();

            //给myArrayList添加元素
            int[] mystrArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 45, 61, 11, 254, 85, 46, 45, 51 };
            myArrayList.AddRange(mystrArray);
            foreach (int outelement in myArrayList) Console.Write(outelement+"\t");

            //用Remove方法删除
            myArrayList.Remove(1);//这里1指的是数组的元素
            Console.WriteLine();
            Console.WriteLine("删除1后的数组为:");
            foreach(int outelement in myArrayList)
            Console.Write(outelement+"\t");

            //用RemoveRange方法删除
            myArrayList.RemoveRange(2, 5);
            Console.WriteLine();
            Console.WriteLine("删除索引值2开始的5个数后的数组为:");
            foreach (int outelement in myArrayList) Console.Write(outelement + "\t");
            Console.ReadKey();

 

10、ArrayList类的查找

  注意与其他数组及字符串查找有区别。

            //例:   
            //声明一个ArrayList类的变量,并给他添加元素
            ArrayList myArrayList = new ArrayList();
            int[] mystrArray = { 1, 2, 3, 4,52, 5, 6, 7, 8, 9, 12, 45, 56, 41, 52 };
            myArrayList.AddRange(mystrArray);          

            //IndexOf(要查找的元素)查找方法,返回一个首次出现的索引值,如果找不到则返回-1
            Console.WriteLine(myArrayList.IndexOf(7));

            //LastIndexOf(要查找的元素)方法,返回最后一个出现的索引值,否则返回-1
            Console.WriteLine(myArrayList.LastIndexOf(0));

            //BinarySearch();利用该方法进行查找的时候会自动转换为二进制            
            Console.WriteLine(myArrayList.BinarySearch(3));
            Console.ReadKey();

 

以上是关于23. 数组的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]

(Cocoa 错误 3840。)”(JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。)

web代码片段

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”