031ArrayList排序操作

    在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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值