[VB.Net] 数组的使用

http://blog.sina.com.cn/s/blog_88deb73d010121q7.html
   数组的作用就是允许用同一个名称来引用多个变量。这些同名的变量依靠各自所带的序数标志来区分,我们把这些序数标志成为下标。第一个元素的下标为0,第二个元素的下标为1,……,依次类推。每个元素的表示是数组名(下标)。如:shuzu(3)表示数组shuzu中的第4个元素。


    VB.NET中的数组有两种类型:定长数组(元素个数在声明时固定下来)和动态数组(声明时不确定元素个数)。一般声明定长数组方式为 [范围] 数组名(最大下标)As 类型。我们把这里的最大下标称为数组的上限数,当然数组的下限数一般都是0。如果上限值为空,则声明的是动态数组。如:Dim shuzu(3) As Integer 定义了一个上限为3,含有3+1个元素的数组shuzu。注意这里的shuzu(3)和上文的shuzu(3)不是一回事,单用shuzu(3)时是元素。


    如果数组为多维数组,声明数组时或表示其元素时需用逗号隔开各维的下标,如Dim shuzu(2,4) As String,定义了一个二维数组,第一维上限为2,第二维上限为4,如果表示其第一行第二列的元素,表示为shuzu(0,1)。因为数组在内存中是用连续的区域来存储的,所以声明数组时每维的长度不能超过Long数据类型的最大值。数组最多有32维。 
    因为数组元素下标的有序性,我们常用For Each … Next 或 For i As Integer = 0 To … 来遍历其所有元素或给数组赋值。如果元素个数不多,给数组赋值也可以在其声明时进行,但此时数组声明中不可有下标值(多维数组可以有逗号)。如:Dim shuzu() As Integer = {1,4,8, 5}。 Dim shuzu(,) As Integer = {{"00","01"},{"10","11"}}。关于多维数组和二维数组的赋值见我的另一篇文章。 
    也可以用系统自带的Array类和其CreateInstance(类型,元素数)方法来给数组声明和赋值。赋值也可以用SetValue,取值用GetValue。如:


    Dim shuzu As Array = Array.CreateInstance(GetType(Integer),5)


    For i As Integer = 0 To 4


    shuzu.SetValue(i*7,i)  'shuzu(i) = i*7


    Next


    For j As Integer = 0 To 4


    MessageBox.Show(shuzu.GetValue(j).ToString)


    Next


    数组的维数可以用Rank获取,每维的长度(其元素个数)可以用Length、LongLength、GetLeng(维)、GetLongLeng(维)方法来得到。如:


        MessageBox.Show(shuzu.Rank.ToString)
        MessageBox.Show(shuzu.GetLength(0).ToString)


    获取每维的上限值用UBound(数组名,维)或数组名.GetUpperBound(维);获取其下限值用LBound(数组名,维)或数组名.GetLowerBound(维)。但注意UBound和LBound的参数维为第一维时是1,不是0。如获取数组shuzu第二维的上限值:


        MessageBox.Show(UBound(shuzu, 2).ToString)
        MessageBox.Show(shuzu.GetUpperBound(1).ToString)


    对于动态数组,声明后如果想使用,需用ReDim语句来改变数组大小。ReDim语句声明只能在过程当中使用,它是可执行语句,可以改变数组中元素的个数,但是却不可以改变数组的维数,并且会把数组中原有的各元素值全部倾空。如果想改变数组大小又不想丢失原来的数据,需要在ReDim后使用Preserve来保存原有数据。对于多维数组,在使用Preserve关键字时,只能修改最后一维的大小。如果改变其他维,那么将出现运行错误。如:


        Dim shuzu(,) As Integer = {{2, 3, 4}, {3, 5, 6}}    'shuzu(1,2)


        ReDim Preserve shuzu(1, 4)                          '使用Preserve后只能修改第二维上限
        For i As Integer = 0 To 1
            For j As Integer = 0 To 4
                MessageBox.Show(shuzu(i, j).ToString) '先后显示为2,3,4,0,0,3,5,6,0,0
            Next
        Next


    如果将数组的各元素赋值为一些数组,则该数组必须声明为Object类型。如:
        Dim shuzu1() As Integer = {1, 3, 4}
        Dim shuzu2() As Integer = {6, 7, 8}
        Dim shuzu3() As Integer = {9, 10, 11}
        Dim shuzu(2) As Object    
        shuzu(0) = shuzu1 : shuzu(1) = shuzu2 : shuzu(2) = shuzu3
        MessageBox.Show(shuzu(1)(2).ToString)     '显示为shuzu第2个元素shuzu(1)也就是shuzu2的第3个元素值8。此处必须关闭Option Strict,否则会显示不允许后期绑定的错误提示。
    如果定义维下限不为0的数组,创建应使用Arry.CreateInstance(GetType(类型),整型维数组,整型下限数组),。如:


        Dim shuzu As Array = Array.CreateInstance(GetType(String), {3, 4}, {1, 2})


        '定义字符数组shuzu,第1维下限为1,上限为3;第2维下限为2,上限为4。
        For i As Integer = 1 To 3
            For j As Integer = 2 To 4
                shuzu(i, j) = i.ToString & "-" & j.ToString
            Next
        Next


        MessageBox.Show(shuzu(3, 2))  


       '显示为3-2;奇怪的是如果用shuzu(3, 5),第二维超限,会返回空,显示空提示框,其他不符合的会出错。


 


一些Array类的常用方法:
1、复制数组方法:


数组.CopyTo(目标数组,目标数组起始位)


数组.Copy(源数组,源数组起始位,目标数组,目标数组起始位,长度)


当然也可以用Redim Preserve来保存源数组值,然后赋值給定义的新数组,如:


        Dim shuzu() As Integer = {3, 5, 67}
        ReDim Preserve shuzu(4)
        Dim shuzu2(4) As Integer
        shuzu2 = shuzu
        MessageBox.Show(shuzu2(2))   '显示67,如果用shuzu2(4),显示为0。


此方法运行速度不如用Copy方法快。


        Dim shuzu As Array = Array.CreateInstance(GetType(Integer), 3)
        shuzu = {3, 5, 67}


        Dim shuzu2 As Array = Array.CreateInstance(GetType(Integer), 4)


        shuzu.CopyTo(shuzu2, 0)


        MessageBox.Show(shuzu2(2))   '显示为67,如shuzu2(3),显示0。


2、返回元素的下标值:


Array.IndexOf(数组,元素值)--返回第一个等于该元素值的元素的下标值


Array.LastIndexOf(数组,元素值)--返回最后一个等于该元素值的元素的下标值


如:MessageBox.Show(Array.IndexOf(shuzu2,67).ToString)     '显示为2。


3、反向排列各元素值:


Array.Reverse(数组)  如Array.Reverse(shuzu2)后再显示shuzu2(0),显示为67。


4、将数组各元素排序:


Array.Sort(数组)-- 数组中的元素对象需执行IComparable接口


Array.Sort(数组,比较类)-- 比较类为执行了IComparer接口的比较方法类


5、搜索数组元素:


Array.BinarySearch(数组,元素值) -- 使用前需先执行Array.Sort,返回该元素的下标值。


例如以下查询例子:


Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim book1 As Book = New Book("Lei Feng Diary")
        Dim book2 As Book = New Book("Tales of Two Cites")
        Dim book3 As Book = New Book("1000 Nights")
        Dim books() As Book = {book1, book2, book3}
        Array.Sort(books)    '排序,因为Book类执行了IComparable接口
        For i As Integer = 0 To 2
            MessageBox.Show(books(i).ToString)  '显示1000--,Lei--,Tales--
        Next
    End Sub


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim book1 As Book = New Book("Lei Feng Diary")
        Dim book2 As Book = New Book("Tales of Two Cites")
        Dim book3 As Book = New Book("1000 Nights")
        Dim books() As Book = {book1, book2, book3}
        Array.Sort(books, New CompareBook)   


     '排序,因为使用了CompareBook比较方法,即使把Book中的Implements IComparable去掉依然成立。
        MessageBox.Show(Array.BinarySearch(books, book1).ToString)    ’显示下标由原来的0变为1


    End Sub
End Class


Public Class Book
    Implements IComparable    ’让该类执行一个比较方法接口
    Public bookname As String


    Public Sub New(ByVal book_name As String)
        bookname = book_name
    End Sub


    Public Overrides Function ToString() As String
        Return bookname
    End Function


    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
        Dim anotherbook As Book = DirectCast(obj, Book)
        Return String.Compare(Me.ToString, anotherbook.ToString)
    End Function
End Class


Public Class CompareBook   '定义一个比较类
    Implements IComparer
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim book1 As Book = DirectCast(x, Book)
        Dim book2 As Book = DirectCast(y, Book)
        Return String.Compare(book1.ToString, book2.ToString)
    End Function
End Class


以上Compare和CompareBook返回的是整型数字,如果返回 -1,则当前对象位于被比较对象的前面;如果返回1,则当前对象位于被比较对象的后面;返回0,不用改动位置。


http://blog.sina.com.cn/s/blog_88deb73d010121q7.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值