昨天有些松懈,甚至觉得自己不该来学这个,对此狠狠的反省自己,既然选择了就要坚持,要相信自己能够做到。
昨天学了集合,当老师让用堆栈实现五子棋的悔棋功能时自己一点头绪都没有,发现自己就是不怎么爱动脑子。以后一定要多想想程序的思想,还有就是欠缺的知识尽快不上来。
集合:
集合和数组的区别:
1.集合是变长的数组是定长的。
2.集合的元素的存和取是有顺序的,数组元素的存取只能用下标。
动态数组,队列,堆栈,哈希表,泛型的哈希表
动态数组:ArrayList
定义方式:
ArrayList al=new ArrayList();
ArrayList a=new ArrayList(new int[]{1,2,3});
ArrayList a2=new ArrayList(4);
1.ArrayList 是一个类,可以用new一个对象来实例化 ,用对象名来调用方法。
2.ArrayList中的常用方法:
通过Add()方法来追加元素,也可以用小标来给已有的元素赋值但不能用来追加元素.例:al.Add(1);这里 add是个Object类型 这里发生了隐式装箱。
Remove()方法用来移除元素 参数即为要移除的元素。
RemoveAt()方法用来移除某一位置上的元素 参数为下标。
Sort()将集合中的元素快速排序。
Reverse()将集合中的元素的顺序反转。
al.RemoveRange(0,2);//移除从第一个元素到第三个元素指间的所有元素.
al.Insert(2,10);//将10插入到第三个位置上,第三个位置往后的元素都后移.
3.常用属性:
获取任何数组的长度用.Length属性 获取任何集合的长度用.Count属性。
查看集合的容量用Capacity属性,集合的容量可以在实例化的时候声明。
如ArrayList al = new ArrayList(4);//ArrayList是一个类,可以new 如果给一个参数表示的容量,一旦设置了容量就按数组元素的容量来翻倍 如是1则下一个事2在下一个是4...
但是如果没有事先声明就按集合中元素小于4的话容量就是4,若超过4个就开始翻倍为8,以此类推。
遍历集合:
foreach(object i in al)
{
Console.WriteLine(i);
}
for(int i=0;i<al.Count;i++)
{
Console.WriteLine(al[i]);
//Console.WriteLine("类型:{0}", al[i].GetType().Name);//取元素类型
//Console.WriteLine("值为:{0}", al[i]);//取元素的值
}
ArrayList 里面也可以放数组 ,可以考虑用于修改自动售货机代码。
List<>:泛型:集合中数据的类型都是object,这样在为集合赋值时就回发生装箱操作。而泛型List把类型当参数,在分配内存时其数据类型已经确 定,相比集合AarryList大大地提高了性能,除此之外二者非常相像,AarryLis的一些方法List一样都适用,所以有了泛型List编程上
一般不采用AarryList。例如:可以定义一个结构体,用它来当作集合List的类型
List<int> list = new List<int>();//泛型:把数据类型当参数,避免装箱拆箱
list.Add(2);//用什么类型传递参数就是什么类型
Console.WriteLine(list[0]);
动态数组的泛型和动态数组的方法差不多,只是Add()放法所添加的是
堆栈:放和取有顺序,先进后出
//栈,可以放元素,但是放和取有顺序,先进后出
Stack st = new Stack();
st.Push(1);
st.Push(2);
遍历一个栈:
foreach (object obj in st)
{
Console.WriteLine(obj);
}
Console.WriteLine(st.Pop());//把栈中最顶层的元素取走,既看又取
Console.WriteLine(st.Peek());//只看不取。
st.Clone();//克隆一个副本
Console.WriteLine("元素数" + st.Count);
//堆栈的泛型
Stack<int> st1 = new Stack<int>();
st1.Push(3);
st1.Push(4);
foreach (int i in st1)
{
Console.WriteLine(i);
}
队列:先进先出
//队列 先进先出
Queue qu = new Queue();
qu.Enqueue(5);
qu.Enqueue(6);
队列的遍历:
foreach(object o in qu)
{
Console.WriteLine(o);
}
Console.WriteLine( qu.Peek());//取最先进的那个元素
Console.WriteLine( qu.Dequeue());//既看又取走
Console.WriteLine("元素个数为:"+qu.Count);
队列泛型:
Queue<int> qul = new Queue<int>();
qul.Enqueue(11);
qul.Enqueue(12);
foreach (int a in qul)
{
Console.WriteLine(a);
}
哈希表:
//哈希表 ,既有键又有值 适合整个对象中有唯一性,因为它的键是唯一的
Hashtable ht = new Hashtable();
ht.Add(1001, new Student { Name="aaa",Age=30});//可以根据键来取值,键和值时唯一对应的 键不能重复。
ht.Add(1,"11111");
ht.Add(2,"22222");
ht.Add("1","333333");
Console.WriteLine(ht[1]);
Console.WriteLine(((Student)ht[1001]).Name);
foreach(object o in ht.Keys)
{
Console.WriteLine(((Student)ht[o]).Name);
}
//哈希表的泛型
Dictionary<int,string> dic=new Dictionary<int,string>();//两个参数,一个存储键,一个存储值,键和值都有准确的类型
dic.Add(1,"aaa");
dic.Add(3,"bbb");