首页 > 解决方案 > 显示行显示索引超出范围

问题描述

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

为此,用户需要从 nameArray 中输入某个名称。二进制搜索,将比较输入和 nameArray(中间)。但是当所有这些都完成后,当使用列表框显示数组时,它会崩溃并说“索引超出了数组的范围”。即使所有数组中的所有项目都有 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

标签: vb.net

解决方案


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

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

在此处输入图像描述 在此处输入图像描述


推荐阅读