2009年9月27日 星期日

BinarySearch (二)

在先前 BinarySearch(一)的介紹,陣列裡面的元素為字串,但陣列所支援的,並非只有字串而已,而現在正要討論的,是當陣列內容是我們自己定義的類別時,還可以用 BinarySearch 嗎?

首先,我定義了一個簡單的 Person 類別:


class Person
{
public string Name = string.Empty;
public string Department = string.Empty;

public Person (string strName, string strDep)
{
Name=strName;
Department=strDep;
}

public string ShowDetail()
{
return string.Format("Name:{0}, Dep:{1}", Name, Department);
}
}





接著,我很開心的一一鍵入我的測試資料:

Person p1 = new Person("paladin", "BPO");
Person p2 = new Person("hugo", "BPO");
Person p3 = new Person("ken", "BPO");
Person p4 = new Person("keen", "BPO");
Person p5 = new Person("polly", "BPO");
Person p6 = new Person("panda", "BPO");
Person p7 = new Person("lillian", "BPO");
Person p8 = new Person("gemma", "BPO");
Person p9 = new Person("hana", "BPO");

Person[] arrayOffice = { p1, p2, p3, p4, p5, p6, p7, p8, p9 };
Array.Sort(arrayOffice);




當我寫到這裡時,傻住了,目前我的 arrayOffice 陣列,可以排序ㄇ?當程式一執行,馬上就丟出了不好的消息:「無法比較陣列中的兩個元素」。的確,字串、數字是可以用來比較大小,但是自己所定義的類別,如果你沒定下比較規則,那真的是拿芭樂比蓮霧了。

所以,重新修改了自己所定義的 Person 類別,讓他實作 IComparable 介面 來解決。


class Person :IComparable //宣告使用了 IComparable 介面
{
// 原先的程式碼
// XXXXXXXXXXXXX
// XXXXXXXXXXXXX

//實做 IComparable 介面
int IComparable.CompareTo(object obj)
{
Person p2 = obj as Person;
if (p2 == null) throw new ArgumentException("Object is not a Person!");
int iNameResult = this.Name.CompareTo(p2.Name);
if (iNameResult == 0)
{
int iDepResult = this.Department.CompareTo(p2.Department);
return iDepResult;
}
else
{
return iNameResult;
}
}



在自己所實作的 CompareTo( )裡,先比較兩個 Person 的 Name 是否一致,如果一致,接著再比較Department 是否一致。也就是當 Name 與 Department 相同時,才視這兩個 Person 物件為相等。



當解決了 Sort( ) 的問題後,接下來的 BinarySearch( )就不是問題了,於是可以繼續將先前打住的程式繼續往下寫下去。



Person p1 = new Person("paladin", "BPO");
Person p2 = new Person("hugo", "BPO");
Person p3 = new Person("ken", "BPO");
Person p4 = new Person("keen", "BPO");
Person p5 = new Person("polly", "BPO");
Person p6 = new Person("panda", "BPO");
Person p7 = new Person("lillian", "BPO");
Person p8 = new Person("gemma", "BPO");
Person p9 = new Person("hana", "BPO");

Person[] arrayOffice = { p1, p2, p3, p4, p5, p6, p7, p8, p9 };
Array.Sort(arrayOffice);
foreach (Person p in arrayOffice)
Console.WriteLine(p.ShowDetail());

Person pSearch = new Person("panda", "BPO");
int iIndex = Array.BinarySearch(arrayOffice,pSearch);
Console.WriteLine("Index of 'panda' object is :" + iIndex.ToString());

Console.Read();

沒有留言:

張貼留言