《Unity虚拟现实技术及其应用》 课件 21 array-list-dict_第1页
《Unity虚拟现实技术及其应用》 课件 21 array-list-dict_第2页
《Unity虚拟现实技术及其应用》 课件 21 array-list-dict_第3页
《Unity虚拟现实技术及其应用》 课件 21 array-list-dict_第4页
《Unity虚拟现实技术及其应用》 课件 21 array-list-dict_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unity3D中常用的数据结构

1、Array数组1.1数组的基本特点在C#语言中,数组是最简单的数据结构之一。其具有如下特点:1.数组存储在连续的内存上。2.数组的内容都是相同类型。3.数组可以直接通过下标访问。一个数组的常规操作主要包括以下两种1.分配存储空间。例如声明一个新数组:int[]arr=newint[5];2.访问数组中的元素数据。例如通过下表来获取数组中某个元素:inti=arr[5];1.2数组的声明和初始化1、Array数组//声明一个一维数组int

[]numbers=

new

int

[5];

//声明并且设置数组元素的值int

[]numbers=

new

int

[]{1,2,3,4,5};

//可代替的语法int

[]array=

{1,2,3,4,5,6};

//声明一个二维数组int

[,]grades=new

int

[4,5];

//声明并且设置数组元素的值int

[]grades=

new

int

[,]

{

{1,82,72,89,100}

{2,93,96,85,86}

{3,83,72,95,89}

{4,91,98,79,88}

};

//声明一个锯齿状数组int

[][]jagged=new

int

[12][];

//设置锯齿状数组结构中第一个数组的值jagged[0]

=

new

int

[4]

{1,2,3,4};1.3数组元素的修改与赋值1.4Array数组的缺点

由于是连续存储,所以在两个元素之间插入新的元素就变得不方便。而且就像上面的代码所显示的那样,声明一个新的数组时,必须指定其长度,这就会存在一个潜在的问题,那就是当我们声明的长度过长时,显然会浪费内存,当我们声明长度过短的时候,则面临这溢出的风险。针对这种缺点下面介绍一下Arraylist数组。1、Array数组string

[]test=new

string

[3];

//赋值test[0]

=

"how";

test[1]

=

"are";

test[2]

=

"you";

//修改test[o]

=

"what";

2.1数组基本特点1.不必在声明ArrayList时指定它的长度,这是由于ArrayList对象的长度是按照其中存储的数据来动态增长与缩减的。2.ArrayList可以存储不同类型的元素。这是由于ArrayList会把它的元素都当做Object来处理。因而,加入不同类型的元素是允许的。2.2数组基本操作2、ArrayList数组ArrayListtest3=

newArrayList();

//新增数据test3.Add("chen");

test3.Add("j");

test3.Add("d");

test3.Add("is");

test3.Add(25);

//修改数据test3[4]

=

26;

//删除数据test3.RemoveAt(4);

实例代码:2、ArrayList数组usingSystem;

usingSystem.Collections;

classclass1{

static

voidMain()

{ArrayListnames=

newArrayList();

//向数组内添加元素names.Add("Mike");

names.Add("Beata");names.Add("Raymond");names.Add("Bernica");

names.Add("Jennifer");

Console.WriteLine("Theorignallistofnames:");

//遍历数组foreach

(Objectnameinnames)Console.WriteLine(name);Console.WriteLine();

//声明一个新数组string[]newNames=

new

string[]

{

"David",

"Michael"

};

ArrayListmoreNames=

newArrayList();moreNames.Add("Terrill");

moreNames.Add("Donnie");moreNames.Add("Mayo");

moreNames.Add("Clayton");

moreNames.Add("Alisa");

//在数组第一个位置添加新的元素names.InsertRange(0,newNames);

//在数组末尾添加元素names.AddRange(moreNames);

Console.WriteLine("Thenewlistofnames:");

foreach

(Objectnameinnames)Console.WriteLine(name);

Console.ReadKey();

}

}运行结果:2、ArrayList数组3.1数组的基本特点为了解决ArrayList不安全类型与装箱拆箱的缺点,所以出现了泛型的概念,作为一种新的数组类型引入。也是工作中经常用到的数组类型。和ArrayList很相似,长度都可以灵活的改变,最大的不同在于在声明List集合时,我们同时需要为其声明List集合内数据的对象类型,这点又和Array很相似,其实List<T>内部使用了Array来实现。3.2基本操作3、List<T>数组List<string>test4=

newList<string>();

//新增数据test4.Add(“Fanyoy”);test4.Add(“Chenjd”);

//修改数据test4[1]

=“murongxiaopifu”;

//移除数据test4.RemoveAt(0);

4.1链表的基本特点和数组最大的不同之处就是在于链表在内存存储的排序上可能是不连续的。这是由于链表是通过上一个元素指向下一个元素来排列的,所以可能不能通过下标来访问。如图若要查找节点P,则必须从头结点head开始查找,逐个访问下一个节点直到找到目标节点p。4、C#中的链表——LinkedList<T>4.2相比于数组链表有以下优势向链表中插入或删除节点无需调整结构的容量。因为本身不是连续存储而是靠各对象的指针所决定,所以添加元素和删除元素都要比数组要有优势。链表适合在需要有序的排序的情境下增加新的元素,这里还拿数组做对比,例如要在数组中间某个位置增加新的元素,则可能需要移动移动很多元素,而对于链表而言可能只是若干元素的指向发生变化而已。

有优点就有缺点,由于其在内存空间中不一定是连续排列,所以访问时候无法利用下标,而是必须从头结点开始,逐次遍历下一个节点直到寻找到目标。所以当需要快速访问对象时,数组无疑更有优势。综上,链表适合元素数量不固定,需要经常增减节点的情况。4、C#中的链表——LinkedList<T>usingSystem;

usingSystem.Text;usingSystem.Collections.Generic;

public

classExample{

public

static

voidMain()

{

//创建链表

string[]words=

{

"the",

"fox",

"jumps",

"over",

"the",

"dog"

};LinkedList<string>sentence=

newLinkedList<string>(words);Display(sentence,

"Thelinkedlistvalues:");Console.WriteLine("sentence.Contains(\"jumps\")={0}",sentence.Contains("jumps"));

//将"today"添加到链表的最前面sentence.AddFirst("today");Display(sentence,

"Test1:将'today'添加到链表的最前面:");

//将第一个节点移动到最后一个节点LinkedListNode<string>mark1=sentence.First;sentence.RemoveFirst();sentence.AddLast(mark1);

Display(sentence,

"Test2:将第一个节点移动到最后一个节点:");

//将最后一个节点的内容变为"yesterday"sentence.RemoveLast();

sentence.AddLast("yesterday");Display(sentence,

"Test3:将最后一个节点的内容变为'yesterday':");

//将最后一个节点的内容移动的第一个节点上mark1=sentence.Last;sentence.RemoveLast();

sentence.AddFirst(mark1);Display(sentence,

"Test4:将最后一个节点的内容移动的第一个节点上:");

//指出"the"的最后一次出现

sentence.RemoveFirst();

LinkedListNode<string>current=sentence.FindLast("the");IndicateNode(current,

"Test5:指出'the'的最后一次出现:");

//指出'fox'节点.current=sentence.Find("fox");IndicateNode(current,

"Test6:指出'fox'节点:");

//将'quick'和'brown'添加到'fox'之前sentence.AddBefore(current,

"quick");sentence.AddBefore(current,

"brown");

IndicateNode(current,

"Test7:将'quick'和'brown'添加到'fox'之前:");

}

LinkList<T>常用方法代码实例//显示指定输出内容及链表内容

private

static

voidDisplay(LinkedList<string>words,

stringtest)

{

Console.WriteLine(test);

foreach

(stringwordinwords)

{Console.Write(word+

"");

}

Console.WriteLine();Console.WriteLine();

}

//演示特定链表节点的各种属性操作private

static

voidIndicateNode(LinkedListNode<string>node,

stringtest)

{

Console.WriteLine(test);

//访问当前接点的LIST属性,即该节点所述的链表if

(node.List==

null)

{Console.WriteLine("Node'{0}'isnotinthelist.\n",node.Value);

return;

}StringBuilderresult=

newStringBuilder("("

+node.Value+

")");

//访问节点的Previous属性来获得当前节点之前的一个节点LinkedListNode<string>nodeP=node.Previous;

while

(nodeP!=

null)

{

result.Insert(0,nodeP.Value+

"");

nodeP=nodeP.Previous;

}

//访问节点的Next属性来获得当前节点之后的一个节点node=node.Next;

while

(node!=

null)

{

result.Append(""

+node.Value);node=node.Next;

}

Console.WriteLine(result);

Console.ReadLine();

}

}

运行结果5.1队列的基本特点

队列是一种把数据从表的末端放入并在表的前端移除的数据结构,他会按照数据项出现的顺序来储存它们,它是先进先出(FIFO)数据结构的实例。队列包含两中主要的操作,添加新数据的操作被称为Enqueue,而从队列中移除数据项的操作则被称为Dequeue。在Queue<T>内部,有一个存放类型为T的对象,并通过head和tail变量来指向数组的头和尾。Queue<T>的初始化容量为32,当时用Enqueue方法将新的元素入列时,会判断队列长度是否足够,若不足则根据增长因子增加容量。5、C#中的队列(Queue<T>)5.2实例代码5、C#中的队列(Queue<T>)usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

classProgram{

static

voidMain(string[]args)

{

//直接创建一个队列

Queue<string>numbers=

newQueue<string>();

//使用Enqueue方法,将新的元素入列numbers.Enqueue("one");

numbers.Enqueue("two");

numbers.Enqueue("three");

numbers.Enqueue("four");

numbers.Enqueue("five");

//遍历一个创建的队列,并输出其内容

foreach

(stringnumberinnumbers)

{

Console.WriteLine(number);

}

//使用Dequeue方法,将第一个字符串出列Console.WriteLine("\n出列’{0}’",numbers.Dequeue());

//初始化Queue<T>类新的实例,该实例包含从指定集合复制的元素

Queue<string>queueCopy=

newQueue<string>(numbers.ToArray());

foreach

(stringnumberinqueueCopy)

{

Console.WriteLine(number);

}

Console.ReadKey();

}

}

运行结果5、C#中的队列(Queue<T>)

6.1栈的基本特点

与Queue<T>相对,当需要使用后进先出顺序(LIFO)的数据结构时,我们就需要用到Stack<T>了。进栈(Push)操作是向栈内添加数据项,而把数据项从栈内取走则用出栈(Pop),这是栈两种基本操作。6、C#中的栈(Stack<T>)6.2代码实例6、C#中的栈(Stack<T>)usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;classProgram{

static

voidMain(string[]args)

{

//创建一个新的Stack<T>实例Stack<string>names=

newStack<string>();

//使用Push方法,将新元素压栈names.Push("xiaoming");

names.Push("zhangsan");

names.Push("lihua");

names.Push("wangmei");

//遍历该栈的元素,并输出其内容foreach(stringnameinnames)

{Console.WriteLine(name);

}

//使用Pop方法,将栈顶的元素弹出Console.WriteLine("\nPopping'{0}'",names.Pop());

/*初始化Stack<T>类新的实例,该实例包含从指定集合复制的元素,并且具有足够的容量来容纳所复制的元素*/

Stack<string>stack2=newStack<string>(names.ToArray());

foreach(stringnameinstack2)

{Console.WriteLine(name);

}

Console.ReadKey();

}

}

运行结果6、C#中的栈(Stack<T>)7.1HashTable(哈希表)基本概念

哈希表(也叫散列表),是根据关键码/值(Key/value)而直接进行访问的数据结构。它通过把关键码/值映射到一个位置来访问记录,以加快查找速度。这个映射函数脚哈希函数或散列函数,存放记录的数组就叫哈希表。7..1.1实例化Hashtable对象并给其添加数据

Hashtable类是System.Collection命名空间的一部分内容,所以你须在程序开始部分导入System.Collection。

Hashtable对象可以用三种方法中的一种进行实例化。7、HashTable和Dictionary<K,T>//创建具有默认容量和默认负载系数的散列表Hashtablesymbols=

newHashtable();

//创建具有默认负载系数和50个元素容量的散列表Hashtablesymbols=

newHashtable(50);

//创建容量为25个元素且负载系数是3.0的散列表Hashtablesymbols=newHashtable(25,3.0F);利用Add方法就可以把键值对添加到散列表内。这个方法会取两个参数:键和与键相关联的数值。在计算完键的散列值之后,会把这个键添加到散列表内。下面是一段实例代码。7.1.2从散列表中分别检索键和数值Hashtable类中有两个非常有用的方法用来从散列表中取回键和数值:即Keys和Values。下面的程序举例说明了这些方法是如何工作的:7、HashTable和Dictionary<K,T>Hashtablesymbols=newHashtable(25);symbols.Add("salary",10000);symbols.Add("name","DavidDur");symbols.Add("age",43);symbols.Add("dept","InformationTechnology");7、HashTable和Dictionary<K,T>usingSystem;

usingSystem.Collections;

classprograms{

static

voidMain()

{

Hashtablesymbols=

newHashtable(25);symbols.Add("salary",10000);symbols.Add("name","DavidDur");symbols.Add("age",45);symbols.Add("dept","InformationTechnology");

Console.WriteLine("Thekeysare:");

foreach(Objectkeyinsymbols.Keys)Console.WriteLine(key);

Console.WriteLine();

Console.WriteLine("Thevaluesare:");

foreach(Objectvalue

insymbols.Values)Console.WriteLine(value);Console.ReadLine();}

}实例程序:

运行结果7、HashTable和Dictionary<K,T>7.1.3检索基于键的数值使用索引可以完成用相关联的键取回数值的操作,这个索引的操作就像数组的索引一样,把键作为索引值来传递,返回与键相关联的数值,除非键不存在,则返回空(null)。

下列代码段举例说明了这种技术的工作过程:返回的值是“DavidDurr”还可以同时使用索引和Keys方法来取回所有储存在散列表的值:7、HashTable和Dictionary<K,T>Objectvalue

=symbols["names"];Console.WriteLine("Thevariablename'svalueis:"

+value.ToString());实例程序:7、HashTable和Dictionary<K,T>usingSystem;

usingSystem.Collections;

classprograms{

static

voidMain()

{

Hashtablesymbols=

newHashtable(25);

symbols.Add("salary",10000);

symbols.Add("name","DavidDur");

symbols.Add("age",45);

symbols.Add("dept",

"InformationTechnology");

symbols["sex"]="Male";

Console.WriteLine();

Console.WriteLine("Hashtabledump-");Console.WriteLine();

foreach(Objectkeyinsymbols.Keys)

Console.WriteLine(key.ToString()

+

":"+symbols[key].ToString());

Console.ReadLine();

}

}运行结果:7、HashTable和Dictionary<K,T>7.2Dictionary<K,T>类

Dictionary<K,T>使用强类型来限制Key和Value,当创建Dictionary<K,T>实例时,必须指定Key和Value的类型。格式如下面代码

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论