• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            ArrayList的使用方法【轉(zhuǎn)載】

             

            ArrayList 的使用方法 【轉(zhuǎn)載】

             

            ***

            Source URL: http://i.yesky.com/bbs/jsp/view.jsp?articleID=889992&forumID=150

            ***  

            1 、什么是 ArrayList
                ArrayList 就是傳說中的動(dòng)態(tài)數(shù)組,用 MSDN 中的說法,就是 Array 的復(fù)雜版本,它提供了如下一些好處:

            動(dòng)態(tài)的增加和減少元素
            實(shí)現(xiàn)了 ICollection 和 IList 接口
            靈活的設(shè)置數(shù)組的大小

            2 、如何使用 ArrayList
               最簡單的例子:
            ArrayList List = new ArrayList();
            for( int i=0;i<10;i++ ) // 給數(shù)組增加 10 個(gè) Int 元素
            List.Add(i);
            //.. 程序做一些處理
            List.RemoveAt(5);// 將第 6 個(gè)元素移除
            for( int i=0;i<3;i++ ) // 再增加 3 個(gè)元素
              List.Add(i+20);
            Int32[] values = (Int32[])List.ToArray(typeof(Int32));// 返回 ArrayList 包含的數(shù)組

            這是一個(gè)簡單的例子,雖然沒有包含 ArrayList 所有的方法,但是可以反映出 ArrayList 最常用的用法

            3 、 ArrayList 重要的方法和屬性
            ( 1 )構(gòu)造器
                ArrayList 提供了三個(gè)構(gòu)造器:
            public ArrayList();
            默認(rèn)的構(gòu)造器,將會(huì)以默認(rèn)( 16 )的大小來初始化內(nèi)部的數(shù)組
            public ArrayList(ICollection);
            用一個(gè) ICollection 對(duì)象來構(gòu)造,并將該集合的元素添加到 ArrayList
            public ArrayList(int);
            用指定的大小來初始化內(nèi)部的數(shù)組

            ( 2 )IsSynchronized 屬性和 ArrayList.Synchronized 方法
                IsSynchronized 屬性指示當(dāng)前的 ArrayList 實(shí)例是否支持線程同步,而 ArrayList.Synchronized 靜態(tài)方法則會(huì)返回一個(gè) ArrayList 的線程同步的封裝。
                如果使用非線程同步的實(shí)例,那么在多線程訪問的時(shí)候,需要自己手動(dòng)調(diào)用 lock 來保持線程同步,例如:
            ArrayList list = new ArrayList();
            //...
            lock( list.SyncRoot ) // 當(dāng) ArrayList 為非線程包裝的時(shí)候, SyncRoot 屬性其實(shí)就是它自己,但是為了滿足 ICollection 的 SyncRoot 定義,這里還是使用 SyncRoot 來保持源代碼的規(guī)范性
            {
            list.Add(  “ Add a Item ”  );
            }

                如果使用 ArrayList.Synchronized 方法返回的實(shí)例,那么就不用考慮線程同步的問題,這個(gè)實(shí)例本身就是線程安全的,實(shí)際上 ArrayList 內(nèi)部實(shí)現(xiàn)了一個(gè)保證線程同步的內(nèi)部類, ArrayList.Synchronized 返回的就是這個(gè)類的實(shí)例,它里面的每個(gè)屬性都是用了 lock 關(guān)鍵字來保證線程同步。

            ****

            但是,使用這個(gè)方法( ArrayList.Synchronized )并不能保證枚舉的同步,例如,一個(gè)線程正在刪除或添加集合項(xiàng),而另一個(gè)線程同時(shí)進(jìn)行枚舉,這時(shí)枚舉將會(huì)拋出異常。所以,在枚舉的時(shí)候,你必須明確使用 SyncRoot 鎖定這個(gè)集合。

             

            Hashtable 與 ArrayList 關(guān)于線程安全性的使用方法類似。

            ****

            ( 3 )Count 屬性和 Capacity 屬性
                Count 屬性是目前 ArrayList 包含的元素的數(shù)量,這個(gè)屬性是只讀的。
            Capacity 屬性是目前 ArrayList 能夠包含的最大數(shù)量,可以手動(dòng)的設(shè)置這個(gè)屬性,但是當(dāng)設(shè)置為小于 Count 值的時(shí)候會(huì)引發(fā)一個(gè)異常。

            ( 4 )Add 、 AddRange 、 Remove 、 RemoveAt 、 RemoveRange 、 Insert 、 InsertRange
                 這幾個(gè)方法比較類似
            Add 方法用于添加一個(gè)元素到當(dāng)前列表的末尾
            AddRange 方法用于添加一批元素到當(dāng)前列表的末尾
            Remove 方法用于刪除一個(gè)元素,通過元素本身的引用來刪除
            RemoveAt 方法用于刪除一個(gè)元素,通過索引值來刪除
            RemoveRange 用于刪除一批元素,通過指定開始的索引和刪除的數(shù)量來刪除
            Insert 用于添加一個(gè)元素到指定位置,列表后面的元素依次往后移動(dòng)
            InsertRange 用于從指定位置開始添加一批元素,列表后面的元素依次往后移動(dòng)

            另外,還有幾個(gè)類似的方法:
            Clear 方法用于清除現(xiàn)有所有的元素
            Contains 方法用來查找某個(gè)對(duì)象在不在列表之中

            其他的我就不一一累贅了,大家可以查看 MSDN ,上面講的更仔細(xì)
            ( 5 )TrimSize 方法
                 這個(gè)方法用于將 ArrayList 固定到實(shí)際元素的大小,當(dāng)動(dòng)態(tài)數(shù)組元素確定不在添加的時(shí)候,可以調(diào)用這個(gè)方法來釋放空余的內(nèi)存。
            ( 6 )ToArray 方法
            這個(gè)方法把 ArrayList 的元素 Copy 到一個(gè)新的數(shù)組中。


            4 ArrayList 與數(shù)組轉(zhuǎn)換
            例 1 :
            ArrayList List = new ArrayList();
            List.Add(1);
            List.Add(2);
            List.Add(3);

            Int32[] values = (Int32[])List.ToArray(typeof(Int32));

            例 2 :
            ArrayList List = new ArrayList();
            List.Add(1);
            List.Add(2);
            List.Add(3);

            Int32[] values = new Int32[List.Count];
            List.CopyTo(values);

            上面介紹了兩種從 ArrayList 轉(zhuǎn)換到數(shù)組的方法

            例 3 :
            ArrayList List = new ArrayList();
            List.Add(  “ string ”  );
            List.Add( 1 );
            // 往數(shù)組中添加不同類型的元素

            object[] values = List.ToArray(typeof(object)); // 正確
            string[] values = (string[])List.ToArray(typeof(string)); // 錯(cuò)誤

            和數(shù)組不一樣,因?yàn)榭梢赞D(zhuǎn)換為 Object 數(shù)組,所以往 ArrayList 里面添加不同類型的元素是不會(huì)出錯(cuò)的,但是當(dāng)調(diào)用 ArrayList 方法的時(shí)候,要么傳遞所有元素都可以正確轉(zhuǎn)型的類型或者 Object 類型,否則將會(huì)拋出無法轉(zhuǎn)型的異常。


            5 、ArrayList 最佳使用建議
            這一節(jié)我們來討論 ArrayList 與數(shù)組的差別,以及 ArrayList 的效率問題
            ( 1 ) ArrayList 是 Array 的復(fù)雜版本
            ArrayList 內(nèi)部封裝了一個(gè) Object 類型的數(shù)組,從一般的意義來說,它和數(shù)組沒有本質(zhì)的差別,甚至于 ArrayList 的許多方法,如 Index 、 IndexOf 、 Contains 、 Sort 等都是在內(nèi)部數(shù)組的基礎(chǔ)上直接調(diào)用 Array 的對(duì)應(yīng)方法。
            ( 2 )內(nèi)部的 Object 類型的影響
            對(duì)于一般的引用類型來說,這部分的影響不是很大,但是對(duì)于值類型來說,往 ArrayList 里面添加和修改元素,都會(huì)引起裝箱和拆箱的操作,頻繁的操作可能會(huì)影響一部分效率。
            但是恰恰對(duì)于大多數(shù)人,多數(shù)的應(yīng)用都是使用值類型的數(shù)組。
            消除這個(gè)影響是沒有辦法的,除非你不用它,否則就要承擔(dān)一部分的效率損失,不過這部分的損失不會(huì)很大。
            ( 3 )數(shù)組擴(kuò)容
            這是對(duì) ArrayList 效率影響比較大的一個(gè)因素。
            每當(dāng)執(zhí)行 Add 、 AddRange 、 Insert 、 InsertRange 等添加元素的方法,都會(huì)檢查內(nèi)部數(shù)組的容量是否不夠了,如果是,它就會(huì)以當(dāng)前容量的兩倍來重新構(gòu)建一個(gè)數(shù)組,將舊元素 Copy 到新數(shù)組中,然后丟棄舊數(shù)組,在這個(gè)臨界點(diǎn)的擴(kuò)容操作,應(yīng)該來說是比較影響效率的。

            例 1 :比如,一個(gè)可能有 200 個(gè)元素的數(shù)據(jù)動(dòng)態(tài)添加到一個(gè)以默認(rèn) 16 個(gè)元素大小創(chuàng)建的 ArrayList 中,將會(huì)經(jīng)過:
            16*2*2*2*2 = 256
            四次的擴(kuò)容才會(huì)滿足最終的要求,那么如果一開始就以:
            ArrayList List = new ArrayList( 210 );
            的方式創(chuàng)建 ArrayList ,不僅會(huì)減少 4 次數(shù)組創(chuàng)建和 Copy 的操作,還會(huì)減少內(nèi)存使用。

            例 2 :預(yù)計(jì)有 30 個(gè)元素而創(chuàng)建了一個(gè) ArrayList :
            ArrayList List = new ArrayList(30);
            在執(zhí)行過程中,加入了 31 個(gè)元素,那么數(shù)組會(huì)擴(kuò)充到 60 個(gè)元素的大小,而這時(shí)候不會(huì)有新的元素再增加進(jìn)來,而且有沒有調(diào)用 TrimSize 方法,那么就有 1 次擴(kuò)容的操作,并且浪費(fèi)了 29 個(gè)元素大小的空間。如果這時(shí)候,用:
            ArrayList List = new ArrayList(40);
            那么一切都解決了。
            所以說,正確的預(yù)估可能的元素,并且在適當(dāng)?shù)臅r(shí)候調(diào)用 TrimSize 方法是提高 ArrayList 使用效率的重要途徑。
            ( 4 )頻繁的調(diào)用 IndexOf 、 Contains 等方法( Sort 、 BinarySearch 等方法經(jīng)過優(yōu)化,不在此列)引起的效率損失
            首先,我們要明確一點(diǎn), ArrayList 是動(dòng)態(tài)數(shù)組,它不包括通過 Key 或者 Value 快速訪問的算法,所以實(shí)際上調(diào)用 IndexOf 、 Contains 等方法是執(zhí)行的簡單的循環(huán)來查找元素,所以頻繁的調(diào)用此類方法并不比你自己寫循環(huán)并且稍作優(yōu)化來的快,如果有這方面的要求,建議使用 Hashtable 或 SortedList 等鍵值對(duì)的集合。
            ArrayList al=new ArrayList();

            al.Add("How");
            al.Add("are");
            al.Add("you!");

            al.Add(100);
            al.Add(200);
            al.Add(300);

            al.Add(1.2);
            al.Add(22.8);

            .........

            // 第一種遍歷  ArrayList  對(duì)象的方法
            foreach(object o in al)
            {
            Console.Write(o.ToString()+" ");
            }

            // 第二種遍歷  ArrayList  對(duì)象的方法
            IEnumerator ie=al.GetEnumerator();
            while(ie.MoveNext())
            {
            Console.Write(ie.Curret.ToString()+" ");
            }

            // 第三種遍歷  ArrayList  對(duì)象的方法
            我忘記了 , 好象是   利用  ArrayList 對(duì)象的一個(gè)屬性 , 它返回一此對(duì)象中的元素個(gè)數(shù) .

            然后在利用索引 
            for(int i=0;i<Count;i++)
            {
            Console.Write(al[i].ToString()+" ");
            }

            -------------------------數(shù)組的用法----------------------------------------------
            數(shù)組概述

            C# 數(shù)組從零開始建立索引,即數(shù)組索引從零開始。 C# 中數(shù)組的工作方式與在大多數(shù)其他流行語言中的工作方式類似。但還有一些差異應(yīng)引起注意。

            聲明數(shù)組時(shí),方括號(hào) ([]) 必須跟在類型后面,而不是標(biāo)識(shí)符后面。在 C# 中,將方括號(hào)放在標(biāo)識(shí)符后是不合法的語法。

            int[] table; // not int table[]; 

            另一細(xì)節(jié)是,數(shù)組的大小不是其類型的一部分,而在 C 語言中它卻是數(shù)組類型的一部分。這使您可以聲明一個(gè)數(shù)組并向它分配 int 對(duì)象的任意數(shù)組,而不管數(shù)組長度如何。

            int[] numbers; // declare numbers as an int array of any size

            numbers = new int[10];  // numbers is a 10-element array

            numbers = new int[20];  // now it's a 20-element array

              聲明數(shù)組

            C# 支持一維數(shù)組、多維數(shù)組(矩形數(shù)組)和數(shù)組的數(shù)組(交錯(cuò)的數(shù)組)。下面的示例展示如何聲明不同類型的數(shù)組:

            一維數(shù)組:

            int[] numbers;
              
            多維數(shù)組:

            string[,] names;
              
            數(shù)組的數(shù)組(交錯(cuò)的):
             
            byte[][] scores;
              
            聲明數(shù)組(如上所示)并不實(shí)際創(chuàng)建它們。在 C# 中,數(shù)組是對(duì)象(本教程稍后討論),必須進(jìn)行實(shí)例化。下面的示例展示如何創(chuàng)建數(shù)組:

            一維數(shù)組:

            int[] numbers = new int[5];
              
            多維數(shù)組:

            string[,] names = new string[5,4];
              
            數(shù)組的數(shù)組(交錯(cuò)的):

            byte[][] scores = new byte[5][];
              
            for (int x = 0; x < scores.Length; x++)
              
            {  
            scores[x] = new byte[4];
            }
              
            還可以有更大的數(shù)組。例如,可以有三維的矩形數(shù)組:

            int[,,] buttons = new int[4,5,3];
              
            甚至可以將矩形數(shù)組和交錯(cuò)數(shù)組混合使用。例如,下面的代碼聲明了類型為 int的二維數(shù)組的三維數(shù)組的一維數(shù)組。

            int[][,,][,] numbers;
              
                
            初始化數(shù)組
              
            C# 通過將初始值括在大括號(hào) ({}) 內(nèi)為在聲明時(shí)初始化數(shù)組提供了簡單而直接了當(dāng)?shù)姆椒āO旅娴氖纠故境跏蓟煌愋偷臄?shù)組的各種方法。

            注意    如果在聲明時(shí)沒有初始化數(shù)組,則數(shù)組成員將自動(dòng)初始化為該數(shù)組類型的默認(rèn)初始值。另外,如果將數(shù)組聲明為某類型的字段,則當(dāng)實(shí)例化該類型時(shí)它將被設(shè)置為默認(rèn)值 null。

             一維數(shù)組

            int[] numbers = new int[5] {1, 2, 3, 4, 5};
              
            string[] names = new string[3] {"Matt", "Joanne", "Robert"};
              
            可省略數(shù)組的大小,如下所示:

            int[] numbers = new int[] {1, 2, 3, 4, 5};
              
            string[] names = new string[] {"Matt", "Joanne", "Robert"};
              
            如果提供了初始值設(shè)定項(xiàng),則還可以省略 new運(yùn)算符,如下所示:

            int[] numbers = {1, 2, 3, 4, 5};
              
            string[] names = {"Matt", "Joanne", "Robert"};
              
            多維數(shù)組
            int[,] numbers = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };
              
            string[,] siblings = new string[2, 2] { {"Mike","Amy"}, {"Mary","Albert"} };
              
            可省略數(shù)組的大小,如下所示:

            int[,] numbers = new int[,] { {1, 2}, {3, 4}, {5, 6} };
              
            string[,] siblings = new string[,] { {"Mike","Amy"}, {"Mary","Albert"} };
              
            如果提供了初始值設(shè)定項(xiàng),則還可以省略 new運(yùn)算符,如下所示:

            int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
            string[,] siblings = { {"Mike", "Amy"}, {"Mary", "Albert"} };
              
            交錯(cuò)的數(shù)組(數(shù)組的數(shù)組)
            可以像下例所示那樣初始化交錯(cuò)的數(shù)組:
            int[][] numbers = new int[2][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
              
            可省略第一個(gè)數(shù)組的大小,如下所示:

            int[][] numbers = new int[][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
              
            -或-

            int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
              
            請注意,對(duì)于交錯(cuò)數(shù)組的元素沒有初始化語法。

            訪問數(shù)組成員
            訪問數(shù)組成員可以直接進(jìn)行,類似于在 C/C++ 中訪問數(shù)組成員。例如,下面的代碼創(chuàng)建一個(gè)名為 numbers的數(shù)組,然后向該數(shù)組的第五個(gè)元素賦以 5:

            int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
              
            numbers[4] = 5;
              
            下面的代碼聲明一個(gè)多維數(shù)組,并向位于 [1, 1]的成員賦以 5:

            int[,] numbers = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };
              
            numbers[1, 1] = 5;
              
            下面聲明一個(gè)一維交錯(cuò)數(shù)組,它包含兩個(gè)元素。第一個(gè)元素是兩個(gè)整數(shù)的數(shù)組,第二個(gè)元素是三個(gè)整數(shù)的數(shù)組:

            int[][] numbers = new int[][] { new int[] {1, 2}, new int[] {3, 4, 5}};
              
            下面的語句向第一個(gè)數(shù)組的第一個(gè)元素賦以 58,向第二個(gè)數(shù)組的第二個(gè)元素賦以 667:

            numbers[0][0] = 58;
              
            numbers[1][1] = 667;
              
            數(shù)組是對(duì)象
              
            在 C# 中,數(shù)組實(shí)際上是對(duì)象 。System.Array是所有數(shù)組類型的抽象基類型。可以使用 System.Array具有的屬性以及其他類成員。這種用法的一個(gè)示例是使用“長度”(Length)屬性獲取數(shù)組的長度。下面的代碼將 numbers數(shù)組的長度(為 5)賦給名為 LengthOfNumbers的變量:

            int[] numbers = {1, 2, 3, 4, 5};
              
            int LengthOfNumbers = numbers.Length;
              
            System.Array 類提供許多有用的其他方法/屬性,如用于排序、搜索和復(fù)制數(shù)組的方法。

            對(duì)數(shù)組使用 foreach
            C# 還提供 foreach語句。該語句提供一種簡單、明了的方法來循環(huán)訪問數(shù)組的元素。例如,下面的代碼創(chuàng)建一個(gè)名為 numbers的數(shù)組,并用 foreach語句循環(huán)訪問該數(shù)組:

            int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0};
              
            foreach (int i in numbers)  
            {      
            System.Console.WriteLine(i);  
            }
              
            由于有了多維數(shù)組,可以使用相同方法來循環(huán)訪問元素,例如:

            int[,] numbers = new int[3, 2] {{9, 99}, {3, 33}, {5, 55}};
              
            foreach(int i in numbers)  
            {  Console.Write("{0} ", i);}
              
            該示例的輸出為:

            9 99 3 33 5 55
              
            不過,由于有了多維數(shù)組,使用嵌套 for循環(huán)將使您可以更好地控制數(shù)組元素。

            posted on 2006-03-06 17:21 夢在天涯 閱讀(4488) 評(píng)論(1)  編輯 收藏 引用 所屬分類: C#/.NET

            評(píng)論

            # re: ArrayList的使用方法【轉(zhuǎn)載】 2007-05-25 19:58 bearhunter

            學(xué)習(xí)  回復(fù)  更多評(píng)論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804903
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            91亚洲国产成人久久精品| 77777亚洲午夜久久多喷| 18岁日韩内射颜射午夜久久成人| 精品少妇人妻av无码久久| 欧美精品国产综合久久| 色播久久人人爽人人爽人人片aV| 久久青青草原亚洲av无码app| 亚洲欧美成人综合久久久| 亚洲精品成人网久久久久久| 久久精品国产亚洲Aⅴ蜜臀色欲 | 美女久久久久久| 久久精品国产WWW456C0M| 国产精品成人99久久久久 | 97久久香蕉国产线看观看| 久久久无码人妻精品无码| 久久99国产综合精品| 精品久久久久久中文字幕| 国产精品亚洲美女久久久| 久久99亚洲综合精品首页| 欧美成人免费观看久久| 色欲av伊人久久大香线蕉影院| 久久精品中文騷妇女内射| 免费观看成人久久网免费观看| 精品久久久久久国产牛牛app| 午夜精品久久久内射近拍高清| 久久婷婷人人澡人人爽人人爱| 亚洲精品国产美女久久久| 69久久夜色精品国产69 | 国产成人久久精品激情| 国产精品成人久久久久三级午夜电影| 国内精品久久国产大陆| 久久久久99精品成人片| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲一本综合久久| 久久国产热精品波多野结衣AV| 午夜精品久久久久久| 久久久久亚洲精品男人的天堂| 狠狠色丁香久久婷婷综| 国产成人久久精品激情 | 久久最新免费视频| 久久综合给合综合久久|