赞
踩
转载连接: http://www.manew.com/thread-36420-1-1.html?_dsign=4be49d78
前言:
可能去过小匹夫博客的盆油们读过这篇对于数据结构的总结,但是小匹夫当时写那篇文章的时候略有匆忙,所以今天进行了一些增改,重新发表在蛮牛。作为程序猿,对于常见的数据结构的掌握是非常必要的,也许这篇文章略显朴实,没有那么花哨的东西,但是小匹夫也希望各位程序向的U3D从业者能喜欢。
前段时间小匹夫读过一份代码,对其中各种数据结构灵活的使用赞不绝口,同时也大大激发了小匹夫对各种数据结构进行梳理和总结的欲望。正好最近也拜读了若干大神的文章,觉得总结下常用的数据结构以供自己也能灵活的使用变得刻不容缓。那么还是从小匹夫的工作内容入手,就谈谈在平时使用U3D时经常用到的数据结构和各种数据结构的应用场景吧。
1.几种常见的数据结构
这里主要总结下小匹夫在工作中常碰到的几种数据结构:Array,ArrayList,List<T>,LinkedList<T>,Queue<T>,Stack<T>,Dictionary<K,T>
数组Array:
数组是最简单的数据结构。其具有如下特点:
1
2
|
int
size = 5;
int
[] test =
new
int
[size];
|
1
2
3
4
5
6
7
|
string
[] test2 =
new
string
[3];
//赋值
test2[0] =
"chen"
;
test2[1] =
"j"
;
test2[2] =
"d"
;
//修改
test2[0] =
"chenjd"
;
|
01
02
03
04
05
06
07
08
09
10
11
|
ArrayList test3 =
new
ArrayList();
//新增数据
test3.Add(
"chen"
);
test3.Add(
"j"
);
test3.Add(
"d"
);
test3.Add(
"is"
);
test3.Add(25);
//修改数据
test3[4] = 26;
//删除数据
test3.RemoveAt(4);
|
1
2
3
4
5
6
7
|
//装箱,将String类型的值FanyoyChenjd赋值给对象。
String info = ”FanyoyChenjd”;
object
obj=(
object
)info;
//拆箱,从Obj中提取值给info
object
obj =
"FanyoyChenjd"
;
String info = (String)obj;
|
01
02
03
04
05
06
07
08
09
10
11
|
List<
string
> test4 =
new
List<
string
>();
//新增数据
test4.Add(“Fanyoy”);
test4.Add(“Chenjd”);
//修改数据
test4[1] = “murongxiaopifu”;
//移除数据
test4.RemoveAt(0);
|
1
2
3
4
5
|
//EggArray类
//定义
public
class
EggArray<T> where T :
class
{
}
|
属性 | 说明 |
Capacity | EggArray的容量 |
Count | EggArray中的元素个数 |
items | T[],一个Array,因为上一篇文章说过List<T>的内部其实还是Array,所以内部我们也使用Array |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
//EggArray<T>的属性&&变量
private
int
capacity;
private
int
count;
private
T[] items;
public
int
Count
{
get
{
return
this
.count;
}
}
public
int
Capacity
{
get
{
return
this
.capacity;
}
}
|
构造函数 | 说明 |
EggArray() | 初始化 EggArray<T> 类的新实例,该实例为空并且具有默认初始容量。 |
EggArray(int32) | 初始化 EggArray<T> 类的新实例,该实例为空并且具有指定的初始容量。 |
01
02
03
04
05
06
07
08
09
10
|
//EggArray的构造函数,默认容量为8
public
EggArray() :
this
(8)
{
}
public
EggArray(
int
capacity)
{
this
.capacity = capacity;
this
.items =
new
T[capacity];
}
|
1
2
3
4
5
6
7
8
9
|
List<
int
> test =
new
List<
int
>(){0,1,2,3,4,5,6,7,8,9};
int
count = 0;
for
(
int
i = 0; i < test.Count; i++)
{
if
(i == 1)
test.Remove(test[i]);
count++;
}
Debug.Log (count);
|
私有方法 | 说明 |
Resize | 当数组元素个数大于或等于数组的容量时,调用该方法进行扩容,会创建一个新的Array存放数据,“增长因子”为2 |
Compact | 压缩数组,在Remove时候默认调用 |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//当数组元素个[/size][/backcolor][/color][i][color=White][backcolor=DarkGreen][size=2]数不小于数组容量时,需要扩容,增长因子growthFactor为2
private
void
Resize()
{
int
capacity =
this
.capacity * growthFactor;
if
(
this
.count > capacity)
{
this
.count = capacity;
}
T[] destinationArray =
new
T[capacity];
Array.Copy(
this
.items, destinationArray,
this
.count);
this
.items = destinationArray;
this
.capacity = capacity;
}
private
void
Compact()
{
int
num = 0;
for
(
int
i = 0; i <
this
.count; i++)
{
if
(
this
.items[i] ==
null
)
{
num++;
}
else
if
(num > 0)
{
this
.items[i - num] =
this
.items[i];
this
.items[i] =
null
;
}
}
this
.count -= num;
}[i][i][i]
|
Array | 需要处理的元素数量确定并且需要使用下标时可以考虑,不过建议使用List<T> |
ArrayList | 不推荐使用,建议用List<T> |
List<T>泛型List | 需要处理的元素数量不确定时 通常建议使用 |
LinkedList<T> | 链表适合元素数量不固定,需要经常增减节点的情况,2端都可以增减 |
Queue<T> | 先进先出的情况 |
Stack<T> | 后进先出的情况 |
Dictionary<K,T> | 需要键值对,快速操作 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。