首页 > 其他分享 >第八单元 数组与集合

第八单元 数组与集合

时间:2023-05-30 11:13:07浏览次数:64  
标签:int ArrayList 元素 第八 Element 索引 数组 单元

1. 数组(Array)

数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。

C# 中的数组

声明数组

在 C# 中声明一个数组,您可以使用下面的语法:

datatype[] arrayName;

其中,

  • datatype 用于指定被存储在数组中的元素的类型。

  • [ ] 指定数组的秩(维度)。秩指定数组的大小。

  • arrayName 指定数组的名称。

例如:

double[] balance;

初始化数组

声明一个数组不会在内存中初始化数组。当初始化数组变量时,您可以赋值给数组。

数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。

例如:

double[] balance = new double[10];

  

赋值给数组

您可以通过使用索引号赋值给一个单独的数组元素,比如:

double[] balance = new double[10];
balance[0] = 4500.0;

 

您可以在声明数组的同时给数组赋值,比如:

double[] balance = { 2340.0, 4523.69, 3421.0};

 

您也可以创建并初始化一个数组,比如:

int [] marks = new int[5]  { 99,  98, 92, 97, 95};

在上述情况下,你也可以省略数组的大小,比如:

int [] marks = new int[]  { 99,  98, 92, 97, 95};

  

您也可以赋值一个数组变量到另一个目标数组变量中。在这种情况下,目标和源会指向相同的内存位置:

int [] marks = new int[]  { 99,  98, 92, 97, 95};
int[] score = marks;

  

当您创建一个数组时,C# 编译器会根据数组类型隐式初始化每个数组元素为一个默认值。例如,int 数组的所有元素都会被初始化为 0。

访问数组元素

元素是通过带索引的数组名称来访问的。这是通过把元素的索引放置在数组名称后的方括号中来实现的。例如:

double salary = balance[9];

  

下面是一个实例,使用上面提到的三个概念,即声明、赋值、访问数组:

实例

static void Main(string[] args)
{
    int []  n = new int[10]; /* n 是一个带有 10 个整数的数组 */
    int i,j;
​
​
    /* 初始化数组 n 中的元素 */        
    for ( i = 0; i < 10; i++ )
    {
        n[ i ] = i + 100;
    }
​
    /* 输出每个数组元素的值 */
    for (j = 0; j < 10; j++ )
    {
        Console.WriteLine("Element[{0}] = {1}", j, n[j]);
    }
    Console.ReadKey();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

  

2. 集合

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。

各种集合类和它们的用法

下面是各种常用的 System.Collection 命名空间的类。点击下面的链接查看细节。

描述和用法
动态数组(ArrayList) 它代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。
哈希表(Hashtable) 它使用来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。
排序列表(SortedList) 它可以使用索引来访问列表中的项。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。
堆栈(Stack) 它代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。
队列(Queue) 它代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队
点阵列(BitArray) 它代表了一个使用值 1 和 0 来表示的二进制数组。当您需要存储位,但是事先不知道位数时,则使用点阵列。您可以使用整型索引从点阵列集合中访问各项,索引从零开始。

1. 动态数组(ArrayList)

动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。

ArrayList 类的方法和属性

下表列出了 ArrayList 类的一些常用的 属性

属性描述
Capacity 获取或设置 ArrayList 可以包含的元素个数。
Count 获取 ArrayList 中实际包含的元素个数。
IsFixedSize 获取一个值,表示 ArrayList 是否具有固定大小。
IsReadOnly 获取一个值,表示 ArrayList 是否只读。
IsSynchronized 获取一个值,表示访问 ArrayList 是否同步(线程安全)。
Item[Int32] 获取或设置指定索引处的元素。
SyncRoot 获取一个对象用于同步访问 ArrayList。

下表列出了 ArrayList 类的一些常用的 方法

序号方法名 & 描述
1 public virtual int Add( object value ); 在 ArrayList 的末尾添加一个对象。
2 public virtual void AddRange( ICollection c ); 在 ArrayList 的末尾添加 ICollection 的元素。
3 public virtual void Clear(); 从 ArrayList 中移除所有的元素。
4 public virtual bool Contains( object item ); 判断某个元素是否在 ArrayList 中。
5 public virtual ArrayList GetRange( int index, int count ); 返回一个 ArrayList,表示源 ArrayList 中元素的子集。
6 public virtual int IndexOf(object); 返回某个值在 ArrayList 中第一次出现的索引,索引从零开始。
7 public virtual void Insert( int index, object value ); 在 ArrayList 的指定索引处,插入一个元素。
8 public virtual void InsertRange( int index, ICollection c ); 在 ArrayList 的指定索引处,插入某个集合的元素。
9 public virtual void Remove( object obj ); 从 ArrayList 中移除第一次出现的指定对象。
10 public virtual void RemoveAt( int index ); 移除 ArrayList 的指定索引处的元素。
11 public virtual void RemoveRange( int index, int count ); 从 ArrayList 中移除某个范围的元素。
12 public virtual void Reverse(); 逆转 ArrayList 中元素的顺序。
13 public virtual void SetRange( int index, ICollection c ); 复制某个集合的元素到 ArrayList 中某个范围的元素上。
14 public virtual void Sort(); 对 ArrayList 中的元素进行排序。
15 public virtual void TrimToSize(); 设置容量为 ArrayList 中元素的实际个数。
static void Main(string[] args)
{
    ArrayList al = new ArrayList();

    Console.WriteLine("Adding some numbers:");
    al.Add(45);
    al.Add(78);
    al.Add(33);
    al.Add(56);
    al.Add(12);
    al.Add(23);
    al.Add(9);

    Console.WriteLine("Capacity: {0} ", al.Capacity);
    Console.WriteLine("Count: {0}", al.Count);

    Console.Write("Content: ");
    foreach (int i in al)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();
    Console.Write("Sorted Content: ");
    al.Sort();
    foreach (int i in al)
    {
        Console.Write(i + " ");
    }
    Console.WriteLine();
    Console.ReadKey();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

Adding some numbers:
Capacity: 8 
Count: 7
Content: 45 78 33 56 12 23 9 
Sorted Content: 9 12 23 33 45 56 78 

3. 使用 foreach 循环

在前面的实例中,我们使用一个 for 循环来访问每个数组元素。您也可以使用一个 foreach 语句来遍历数组。

实例

static void Main(string[] args)
{
    int []  n = new int[10]; /* n 是一个带有 10 个整数的数组 */


    /* 初始化数组 n 中的元素 */        
    for ( int i = 0; i < 10; i++ )
    {
        n[i] = i + 100;
    }

    /* 输出每个数组元素的值 */
    foreach (int j in n )
    {
        int i = j-100;
        Console.WriteLine("Element[{0}] = {1}", i, j);
    }
    Console.ReadKey();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

 

4. C# 数组细节

在 C# 中,数组是非常重要的,且需要了解更多的细节。下面列出了 C# 程序员必须清楚的一些与数组相关的重要概念:

概念描述
多维数组 C# 支持多维数组。多维数组最简单的形式是二维数组。
传递数组给函数 您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
参数数组 这通常用于传递未知数量的参数给函数。

1. 多维数组

C# 支持多维数组。多维数组又称为矩形数组。

您可以声明一个 string 变量的二维数组,如下:

string [,] names;

  

或者,您可以声明一个 int 变量的三维数组,如下:

int [ , , ] m;

  

二维数组

多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。

一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:

C# 中的二维数组

初始化二维数组

多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。

int [,] a = new int [3,4] {
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

 

访问二维数组元素

二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:

int val = a[2,3];

  

上面的语句将获取数组中第 3 行第 4 个元素。您可以通过上面的示意图来进行验证。让我们来看看下面的程序,我们将使用嵌套循环来处理二维数组:

static void Main(string[] args)
{
    /* 一个带有 5 行 2 列的数组 */
    int[,] a = new int[5, 2] {{0,0}, {1,2}, {2,4}, {3,6}, {4,8} };

    int i, j;

    /* 输出数组中每个元素的值 */
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 2; j++)
        {
            Console.WriteLine("a[{0},{1}] = {2}", i, j, a[i,j]);
        }
    }
    Console.ReadKey();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

a[0,0]: 0
a[0,1]: 0
a[1,0]: 1
a[1,1]: 2
a[2,0]: 2
a[2,1]: 4
a[3,0]: 3
a[3,1]: 6
a[4,0]: 4
a[4,1]: 8

  

2. 传递数组给函数

在 C# 中,您可以传递数组作为函数的参数。您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。

public static double getAverage(int[] arr, int size)
{
    int i;
    double avg;
    int sum = 0;

    for (i = 0; i < size; ++i)
    {
        sum += arr[i];
    }

    avg = (double)sum / size;
    return avg;
}
static void Main(string[] args)
{
    MyArray app = new MyArray();
    /* 一个带有 5 个元素的 int 数组 */
    int [] balance = new int[]{1000, 2, 3, 17, 50};
    double avg;

    /* 传递数组的指针作为参数 */
    avg = getAverage(balance, 5 ) ;

    /* 输出返回值 */
    Console.WriteLine( "平均值是: {0} ", avg );
    Console.ReadKey();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

平均值是: 214.4

  

3. 参数数组

有时,当声明一个方法时,您不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。

params 关键字

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用格式为:

public 返回类型 方法名称( params 类型名称[] 数组名称 )
public static int AddElements(params int[] arr)
{
    int sum = 0;
    foreach (int i in arr)
    {
        sum += i;
    }
    return sum;
}

static void Main(string[] args)
{
    ParamArray app = new ParamArray();
    int sum = app.AddElements(512, 720, 250, 567, 889);
    Console.WriteLine("总和是: {0}", sum);
    Console.ReadKey();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

总和是: 2938

 

5. 作业

  1. 求两个二维数组的和

    1    3    5                2       4      6
    7 9 2 + 8 9 7 = ?
    4 6 8 3 5 1

    数组A 数组B 数组C
  2. 假设一个数组共有20个元素,其中前5位元素是:1,1,2,3,5..... 打印出数组的第20位元素的值。

  3. 创建一个ArrayList 集合对象,循环10次向集合中添加10个元素。

  4. 将第三题的集合按从大到小的顺序进行输出(可直接调用现成的集合封装好的方法)。

  

视频教程:

誉尚学教育_誉尚学教育腾讯课堂官网 (qq.com)
或者:
C# 最强入门编程(.Net 学习系列开山巨作)_哔哩哔哩_bilibili

标签:int,ArrayList,元素,第八,Element,索引,数组,单元
From: https://www.cnblogs.com/xuyubing/p/17442684.html

相关文章

  • 第六单元 流程控制
    C#流程语句分为:顺序结构,选择结构,循环结构。1.顺序结构顺序结构指的是程序一步步向下执行。inta=10;intb=a;a++;2.选择结构C#提供以下类型的选择语句。声明描述if声明一个if语句包含一个布尔表达式后跟一个或多个语句。if...else声明一个if语句可以跟......
  • 两个有序数组的第K小乘积
    给你两个从小到大排好序 且下标从0 开始的整数数组 nums1和 nums2 以及一个整数 k 请你返回第 k (从1 开始编号)小的 nums1[i]*nums2[j] 的乘积1.二分查找classSolution{public:typedeflonglongll;longlongkthSmallestProduct(vector<int>&......
  • 代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、2
    242.有效的字母异位词力扣题目链接(opensnewwindow)给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false说明: 你可以假设字符串只包含小写字母。思路:......
  • hdu 3874(树状数组+离线算法)
    解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和。可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所以离线算法帮助我们把要查询的区间先按照右端点进行排序,因为在处理更靠右的区间时,......
  • 2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次
    七、设计算法,仅使用三次实数乘法即可完成复数a+bi和c+di相乘。算法需接收a、b、c和d为输入,分别生成实部ac-bd和虚部ad+bc。文心一言:可以使用如下算法来计算复数a+bi和c+di的积,且只需进行三次实数乘法:1.将a和b相乘,得到ab;2.将c和d相乘,得到cd;3.将ab+cd赋......
  • 斐波那契数列:2.数组
    斐波那契数列:2.数组#include<stdio.h>intfib(intm){inti;inta[100]={0,1,1};for(i=2;i<=m;i++){a[i]=a[i-1]+a[i-2];}returna[m];}intmain(){intn;scanf("%d",&n);printf("%d",fib(n));return0......
  • 第五单元 函数(方法)
    1.函数(方法)的简介函数,在C#中更多的被称为方法。它表示一个的类所具有的行为(方法,函数)。方法的作用封装一些公共的代码,以达到功能重复利用,减少代码冗余。例如,我们经常要进行输入,输出,系统于是帮我们封装好了Console.WriteLine(),Console.ReadLine()等方法。一个方法是把一......
  • 33. 搜索旋转排序数组
    分析:A对于题目中定义的旋转数组,从中间一分为二。一定是被分为一个有序数组,一个旋转数组(循环数组)。B若对旋转数组再次从中间分割,会重复A的操作。对有序数组二分可看做普通二分查找一致操作。定理一:只有在顺序区间内才可以通过区间两端的数值判断target是否在其中。定理二:判......
  • js-01_数组
    数组的常用方法数组常用方法之pushpush是用来在数组的末尾追加一个元素vararr=[1,2,3]//使用push方法追加一个元素在末尾arr.push(4)console.log(arr)//[1,2,3,4]数组常用方法之poppop是用来删除数组末尾的一个元素vararr=[1,2,3]//使......
  • hdu 4417(树状数组+离线算法)
    解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样。关键是如何转换成树状数组的模型,这才是本题的难点。我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了。我们还可以发现,如果找到了当前的比h小的所有点(大于的点我们先忽略掉),那么我们就......