在ArrayList的方法成员中,调用Sort方法可以轻松实现对集合中的元素进行排序。Sort有三种重载方法,声明代码如下所示:
Sort() | 对整个 ArrayList 中的元素进行排序。该方法使用Array.Sorrt方法进行排序,也就是QuickSort算法。此实现执行不稳定排序,即如果两元素相等,则其顺序可能不被保留。相反,稳定排序则保留相等元素的顺序。 |
Sort(IComparer) | 使用指定的比较器对整个 ArrayList 中的元素进行排序。如果Comparer设置为Nothing,则此方法执行不稳定排序。如果要执行稳定排序,则必须实现自定义的IComparer接口 |
Sort(Int32, Int32, IComparer) | 使用指定的比较器对 ArrayList 中某个范围内的元素进行排序。 |
Module Module1
Sub Main()
Dim myAL As New ArrayList
myAL.Add("If")
myAL.Add("you")
myAL.Add("try")
myAL.Add("hard")
myAL.Add("you")
myAL.Add("will")
myAL.Add("succeed")
myAL.Add("quick")
Console.WriteLine("列表ArrayList的初始内容是:")
PrintValues(myAL)
myAL.Sort()
Console.WriteLine("排序后是:")
PrintValues(myAL)
Console.Read()
End Sub
Private Sub PrintValues(ByVal list As ICollection)
Dim obj As Object
For Each obj In list
Console.Write(" {0}", obj)
Next
Console.WriteLine()
End Sub
End Module
一个例子
Public Class Book
Private _bookname As String
Private _bookprice As Double
Private _bookCategory As String
Public Property bookname As String
Get
Return _bookname
End Get
Set(ByVal value As String)
_bookname = value
End Set
End Property
Public Property bookprice As Double
Get
Return _bookprice
End Get
Set(ByVal value As Double)
_bookprice = value
End Set
End Property
Public Property bookcategory As String
Get
Return _bookCategory
End Get
Set(ByVal value As String)
_bookCategory = value
End Set
End Property
Public Sub New(ByVal name As String, ByVal price As Double, ByVal category As String)
bookname = name
bookprice = price
bookcategory = category
End Sub
End Class
Public Class ComparerByPrice
Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
If TypeOf x Is Book And TypeOf y Is Book Then
Dim obj1 As Book = CType(x, Book)
Dim obj2 As Book = CType(y, Book)
If obj1.bookprice < obj2.bookprice Then
Return -1
ElseIf obj1.bookprice = obj2.bookprice Then
Return 0
Else
Return 1
End If
Else
Throw New ArgumentException("对象不是Book类型")
End If
End Function
End Class
Public Class CommparerByName
Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
'忽略字母大小,比较两个字符串
Return New CaseInsensitiveComparer().Compare(CType(x, Book).bookname, CType(y, Book).bookname)
End Function
End Class
Module Module1
Sub Main()
Dim books() As Book = {New Book("C#入门", 45.5, "C#"), _
New Book("Visual Basic.Net 入门", 55.8, "Visual Basic"), _
New Book("Delphi程序设计", 78, "Delphi"), _
New Book("Visual C++.Net 技术内幕", 66, "C++"), _
New Book("ASP.NET", 44, "ASP.NET")}
Dim myAL As ArrayList = New ArrayList(books)
Console.WriteLine("列表ArrayList的初始内容是:")
PrintValues(myAL)
myAL.Sort(New ComparerByPrice)
Console.WriteLine("按价格排序后:")
PrintValues(myAL)
myAL.Sort(New CommparerByName)
Console.WriteLine("按书名排序后:")
PrintValues(myAL)
Console.Read()
End Sub
Private Sub PrintValues(ByVal list As ICollection)
Dim i As Integer
Dim obj As Book
For Each obj In list
Console.WriteLine("[{0}] " & "书名:" & obj.bookname.ToString.PadRight(25) & vbTab & "价格:" & obj.bookprice.ToString.PadRight(10), i)
i = i + 1
Next
Console.WriteLine()
End Sub
End Module