1. 程式人生 > >對ArrayList的自定義元素進行排序

對ArrayList的自定義元素進行排序

ArrayList的Sort(IComparer)方法使用指定的比較器對整個 ArrayList 中的元素進行排序。向ArrayList中新增的自定義元素,當需要排序時,需要公開比較元素方法。

以下是一個例子。

先宣告需要新增到ArrayList的自定義元素型別one:
public class One
 {
  public  string   N;
  public  int      I;

  public One(string n, int i)
  {
   N = n;
   I = i;
  }
 }

公開比較元素方法:
ArrayList 比較元素時要使用 IComparer 實現。以下是三個比較器

比較器oneIComparer1實現比較兩個One(按照One.N的升序排列)
public class oneIComparer1 : IComparer 
 {
  int IComparer.Compare( Object x, Object y ) 
  {
   return string.Compare(((One)x).N,((One)y).N);
  }
 }

比較器oneIComparer2實現比較兩個One(按照One.N的降序排列)
public class oneIComparer2 : IComparer 
 {
  int IComparer.Compare( Object x, Object y ) 
  {
   return string.Compare(((one)y).N,((one)x).N);
  }
 }

比較器oneIComparer3實現比較兩個One(按照One.I的升序排列)
public class oneIComparer3 : IComparer 
 {
  int IComparer.Compare( Object x, Object y ) 
  {
   return ((One)x).I.CompareTo(((One)y).I);
  }
 }
  
ArrayList list = new ArrayList();

//向list新增三個型別為One的元素
list.Add(new One("a1",999));
list.Add(new One("a2",998));
list.Add(new One("a3",997));


//建立自定義比較器comparer1
comparer1 = new oneIComparer1();
//按照自定義比較器comparer1對list中的元素排序(升序排列)
list.Sort(comparer1);
//使用比較器comparer1在整個已排序的 list 中搜索One.N的值為"a3"的元素從零開始的索引。
list.BinarySearch(new One("a3",0),comparer1) 的值為2

//按照One.N的降序排列後搜尋One.N的值為"a3"的元素從零開始的索引。
comparer2 = new oneIComparer2();
list.Sort(comparer2);
list.BinarySearch(new One("a3",0),comparer2) 的值為0

//搜尋One.I的值為997的元素從零開始的索引。
comparer3 = new oneIComparer3();
list.Sort(comparer3);
list.BinarySearch(new One("",997),comparer3) 的值為0

為了程式碼更加清晰,並容易理解,可以給One新增一個建構函式
public One(string n)
{
 N = n;
}

list.BinarySearch(new One("a3",0),comparer1)可改為:
list.BinarySearch(new One("a3"),comparer1)