显示行显示索引超出范围

时间:2019-05-12 02:55:50

标签: vb.net

有一个按钮,它通过搜索另一个数组中的输入来显示数组中的项目。在这种情况下,我想显示一个来自animalArray的项目。

为此,用户需要从nameArray输入特定名称。二进制搜索,将比较输入和nameArray(middle)。但是,当所有这些操作完成后,当使用列表框显示数组时,它就会崩溃并说“索引超出数组范围”。即使所有数组中的所有项目都有9个项目(包括0)。

binarySearch(nameArray, animalArray, InputBox("Enter Owner name", "Owner name"))

如何解决这个问题?

Sub binarySearch(ByVal array1, ByVal array2, ByVal item)
    Sort()
    Dim low = 0
    Dim high = 9
    Dim middle As String
    Dim subfindindex = -1
    Do While low <= high And subfindindex = -1
        middle = (low + high) \ 2
        If array1(middle) = item Then
            subfindindex = middle
            Exit Do
        End If
        If middle > item Then
            high = middle - 1
        Else
            low = middle + 1
        End If
    Loop

    ListBox1.Items.Add(array2(subfindindex)) '<--- index was out of bounds of array

End Sub

1 个答案:

答案 0 :(得分:0)

您的主要问题是您正在将数字与名称进行比较,并试图确定哪个更大:

If middle > item Then

相反,您需要将数字(middle的值)与名称数组中名称的索引进行比较。

也就是说,通过使用列表而不是数组,以及通过描述性命名和强烈键入参数变量,您将获得更多收益。这是工作代码:

Public Class Form1
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Animals As New List(Of String)
    Dim Names As New List(Of String)

    Animals.Add("Dog")
    Animals.Add("Cat")
    Animals.Add("Sheep")
    Animals.Add("Goat")
    Animals.Add("Chicken")
    Animals.Add("Fish")
    Animals.Add("Cow")
    Animals.Add("Snake")
    Animals.Add("Rabbit")
    Animals.Add("Squirrel")

    Names.Add("Jim")
    Names.Add("Betty")
    Names.Add("Frank")
    Names.Add("Paul")
    Names.Add("Susan")
    Names.Add("Debbie")
    Names.Add("Bob")
    Names.Add("Tina")
    Names.Add("Fred")
    Names.Add("Bill")

    Me.BinarySearch(Names, Animals, InputBox("Enter Owner name", "Owner name"))
  End Sub

  Sub BinarySearch(Names As List(Of String), Animals As List(Of String), Name As String)
    Dim SubFindIndex As Integer
    Dim Middle As Integer
    Dim High As Integer
    Dim Low As Integer

    SubFindIndex = -1
    High = 9
    Low = 0

    Do While Low <= High And SubFindIndex = -1
      Middle = (Low + High) \ 2

      If Names(Middle) = Name Then
        SubFindIndex = Middle
        Exit Do
      End If

      If Middle > Names.IndexOf(Name) Then
        High = Middle - 1
      Else
        Low = Middle + 1
      End If
    Loop

    Me.ListBox1.Items.Add(Animals(SubFindIndex))
  End Sub
End Class

但是实现相同目标的方法要简单得多:

Sub BinarySearch2(Names As List(Of String), Animals As List(Of String), Name As String)
  Dim Animal As String
  Dim Index As Integer

  Index = Names.IndexOf(Name)
  Animal = Animals(Index)

  Me.ListBox1.Items.Add(Animal)
End Sub

-编辑-

InputBox的列表中输入名称后,您将看到以下内容:

enter image description here enter image description here