[翻譯]C#資料結構與演算法 – 第二章(Part2完)

來源:互聯網
上載者:User

ArrayList類

    由於在使用時一個數組的長度不能預Crowdsourced Security Testing道或者可能在一個程式的生命週期中改變,靜態數組並不是很有用。此問題的一種解決方案是在程式中使用一種當超過預設的儲存空間時可以動態調整大小的數組。這類數組稱為ArrayList,位於.Net類庫的System.Collections下。

    一個ArrayList對象有一個Capacity屬性儲存區它的大小。這個屬性的初始值為16。當一個ArrayList中的元素數達到這個限制時,ArrayList自動添加Capacity屬性所表示的16個元素的儲存空間。在數組元素的數目可能變大變小的情況下使用ArrayList比使用標準數組的ReDim方法更有效率。

    像我們在第一章討論過的那樣,一個ArrayList對象中儲存了object類型的對象。如果你需要以強型別方式儲存,你需要使用標準的數組或其它的資料結構。

ArrayList類的成員

    ArrayList類包含了需要方法與屬性來使你可以方便的使用ArrayList。下面是一個最為常用的方法與屬性的列表。

Add(): 向ArrayList中添加一個元素。

AddRange(): 向ArrayList的尾部添加一些元素的集合

Capacity: ArrayList預設可以儲存的元素的數目

Clear(): 移除ArrayList中的所有元素

Contains(): 判斷ArrayList中是否包含一個指定的項

CopyTo(): 拷貝一個ArrayList或者其中的一部分到另一個數組

Count: 返回ArrayList中當前元素的數目

GetEnumerator(): 返回一個列舉程式來迭代ArrayList

GetRange(): 取得ArrayList的一個子集作為一個新的ArrayList

IndexOf(): 返回與指定項目第一個匹配的索引

Insert(): 在ArrayList的指定索引處插入一個元素

InsertRange(): 由ArrayList的指定位置處開始插入一個元素的集合

Item: 屬性-指定索引處的元素

Remove(): 移除指定項目的第一個匹配

RemoveAt(): 移除指定索引處的元素

Reserve(): 將ArrayList中的元素反序排列

Sort(): 按字母順序排列ArrayList中的元素

ToArray(): 拷貝ArrayList的元素到一個數組

TrimToSize(): 設定Capacity屬性為ArrayList中的實際元素數

使用ArrayList類

    ArrayList使用起來不想標準數組。通常,項目是使用Add方法添加到ArrayList中,除非有特殊原因,一個元素需要被添加到一個特殊位置,在這種情況下需要使用Insert方法。在這節中,我們來看一下怎樣使用ArrayList中零零總總的方法。

    我們首先需要做的是按如下方式聲明一個這個類的對象:

ArrayList grades = new ArrayList();

注意在聲明中調用了建構函式。如果一個ArrayList不使用建構函式,在後續的程式語句中這個對象不可用。

    對象使用Add方法添加一個對象到ArrayList。這個方法接受一個參數 – 一個要添加到ArrayList的對象。同時這個方法也返回一個整型表明元素被添加到的位置,雖然這個值在程式中不常用。下面是一些例子:

grades.Add(100);

grades.Add(84);

int position;

position = grades.Add(77);

Console.WriteLine("The grade 77 was added at position: " + position);

    ArrayList中的對象可以使用一個foreach迴圈來顯示。ArrayList有一個內建的列舉程式管理ArrayList中所有對象的迭代,一次一個。下面的程式碼片段展示了怎樣在ArrayList中使用一個foreach迴圈。

int total = 0;

double average = 0.0;

foreach (Object grade in grades)

total += (int)grade;

average = total / grades.Count;

Console.WriteLine("The average grade is: " + average);

    如果你要在ArrayList的指定位置添加一個元素,你可以使用Insert方法。這個方法接受兩個參數:要插入元素的位置,及要插入的元素。下面的程式碼片段在指定位置插入兩個分數,以保持ArrayList的對象的順序:

grades.Insert(1, 99);

grades.Insert(3, 80);

    你可以通過調用Capacity屬性來查看一個ArrayList當前的容量,通過Count屬性來查看一個ArrayList中當前的元素數目:

Console.WriteLine("The current capacity of grades is: " + grades.Capacity);

Console.WriteLine("The number of grades in grades is: " + grades.Count);

    由數組中移除項有幾種方式。如果你知道你要移除的項,但是不知道其所在的位置,你可以使用Remove方法。這個方法僅接受一個參數 – 要由ArrayList移除的對象。如果對象存在於ArrayList中,它將被移除。如果對象不再數組當中,將不會進行任何處理。當類似Remove的方法被調用時,其通常被放在一個If-Then語句內來調用,並使用方法(如Contains方法)驗證這個對象是否存在於ArrayList。下面是這個過程的範例程式碼段:

if (grades.Contains(54))

grades.Remove(54);

else

Console.Write("Object not in ArrayList.");

    如果你知道你要移除的對象的索引,你可以使用RemoveAt方法。這個方法接受一個參數-你要移除的對象的索引。唯一會引起的異常時 當你傳給方法一個無效的索引。方法工作方式如下:

grades.RemoveAt(2);

    通過調用ArrayList的IndexOf方法你可以確定一個對象的位置。這個方法接受一個參數 – 待尋找的對象,並返回對象在ArrayList中的位置。如果對象不在ArrayList中,該方法返回-1。一下程式碼片段展示了結合使用IndexOf方法與RemoveAt方法:

int pos;

pos = grades.IndexOf(70);

grades.RemoveAt(pos);

    除了添加單個對象到ArrayList外,你也可以添加一個範圍的對象。這些對象須是儲存於一個實現ICollection介面的類型的對象當中。這意味著對象可以是儲存於一個數組,一個集合甚至是另一個ArrayList當中。

    有兩種不同的方法可以添加一個範圍內的對象到ArrayList,分別是AddRange方法與InsertRange方法。AddRange方法添加一個範圍的對象到ArrayList的尾部,InsertRange方法添加一個範圍的對象到ArrayList中的指定位置。

    下面的程式展示了這兩個方法的使用:

using System;

using System.Collections;

class class1 {

static void Main()

{

ArrayList names = new ArrayList();

names.Add("Mike");

names.Add("Beata");

names.Add("Raymond");

names.Add("Bernica");

names.Add("Jennifer");

Console.WriteLine("The original list of names: ");

foreach (Object name in names)

Console.WriteLine(name);

Console.WriteLine();

 

string[] newNames = new string[] { "David", "Michael" };

ArrayList moreNames = new ArrayList();

moreNames.Add("Terrill");

moreNames.Add("Donnie");

moreNames.Add("Mayo");

moreNames.Add("Clayton");

moreNames.Add("Alisa");

names.InsertRange(0, newNames);

names.AddRange(moreNames);

Console.WriteLine("The new list of names: ");

foreach (Object name in names)

Console.WriteLine(name);

}

}

這段程式的輸出如下:

David Michael Mike Bernica Beata Raymond Jennifer Terrill Donnie Mayo Clayton Alisa

    由於指定的索引為0,前兩個名字被添加到ArrayList的起始位置,由於AddRange方法的使用後面的名字被添加到尾部。

    另外兩個程式員認為有用的方法是ToArray方法與GetRange方法。GetRange方法返回一個ArrayList中指定範圍的對象到另一個ArrayList。ToArray方法拷貝ArrayList中所有元素到一個數組。首先我們看一下GetRange方法。

    GetRange方法接受兩個參數:起始索引及要由ArrayList中檢索的元素的數目。GetRange方法是非破壞性的,即它僅僅是由原始ArrayList拷貝對象到新的ArrayList。下面例子展示了這是方法的作用,它使用了前文的程式:

ArrayList someNames = new ArrayList();

someNames = names.GetRange(2, 4);

Console.WriteLine("someNames sub-ArrayList: ");

foreach (Object name in someNames)

Console.WriteLine(name);

程式片段的輸出為:

Mike Bernica Beata Raymond

    ToArray方法是你可以輕鬆的將ArrayList中的內容移動到一個標準數組中。你將使用ToArray方法的主要原因是使用數組可以獲得更快的訪問速度。

    ToArray方法不接受參數,並將ArrayList中的元素返回到一個數組中。下面的例子展示了這個方法的使用:

Object[] arrNames;

arrNames = names.ToArray();

Console.WriteLine("Names from an array: ");

for (int i = 0; i <= arrNames.GetUpperBound(0); i++)

Console.WriteLine(arrNames[i]);

    程式碼片段的最後一部分證明了ArrayList中的元素已經真實的被儲存在arrNames的數組中。

 

摘要

    數組是電腦程式設計中最常用的資料結構。幾乎所有的電腦語言內建對各類形式數組的支援。

    對許多程式,數組是最易實現的資料結構且最高效。當你需要直接存取你資料集中一個位於後部的元素時,數組非常有用。

    .NET Framework引入了一種稱為ArrayList的新類型的數組。ArrayList有很多數組的特點,但是更為強大,因為當達到最大容量時它們可以調整自身的大小。ArrayList也有一些實用的方法,如執行插入,聲明與尋找。由於C#中不允許像在VB.NET中那樣動態調整一個數組的大小,所以當你處理一個無法提前預知項目的數目的儲存時ArrayList就是一種很有用的資料結構。

 

聯絡

1. 設計並實現一個類,使教師可以跟蹤一門課的分數。其中包括計算平均成績,最高分,最低分的方法。寫一個程式來測試你類的實現。

2. 修改聯絡1中的類,使其可以記錄多個課程的成績。寫一個程式來測試你的實現。

3. 使用ArrayList重寫聯絡1.編寫一個程式來測試你的實現,並使用Timing類來比較其與聯絡1的數組實現效能。

4. 設計並實現一個類,使用數組來類比ArrayList類的行為。儘可能多的實現ArrayList中的方法。編寫一個程式來測試你的類。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.