VB 一次移动多个索引

VB Moving several indexes at one time

只是想问一个关于在排序算法中一次移动数组的多个索引的问题。

基本上,我使用冒泡排序算法(在 VB.NET 中)对包含姓名、身高、体重和年龄的数据列表进行排序。每个名称本质上都与每个额外的数据相关联。此数据从 txt 文件发送,然后使用算法进行排序。也可以编辑此文件以添加新名称或数据片段。

有没有一种方法可以关联数据片段,以便在对数组排序时数据与名称保持一致,而名称已按字母顺序排序?

txt文件的排列方式及排序方式示例:

未排序:

蒙蒂雷耶斯

28

1700

70.7

基尔伯克

45

1800

93.5

已排序:

基尔伯克

45

1800

93.5

蒙蒂雷耶斯

28

1700

70.7

我当前的代码只是对整个数组进行排序的简单冒泡排序。

Private Sub btnNameSort_Click(sender As Object, e As EventArgs) Handles btnNameSort.Click
    'turn the listbox items found in lstCurrentData to an array()
    Dim Data() As String = lstCurrentData.Items.Cast(Of Object).Select(Function(o) lstCurrentData.GetItemText(o)).ToArray
    Dim temp As String


    For ii = 0 To Data.Length - 2
        For i = 0 To Data.Length - 2
            If Data(i) > Data(i + 1) Then
                temp = Data(i)
                Data(i) = Data(i + 1)
                Data(i + 1) = temp
            End If
        Next
    Next
    For Each st In Data
        lstSortArray.Items.Add(st)
    Next
End Sub

如果有人对在数组中创建这些关联有任何想法,请告诉我,我真的不知道该从哪里开始。我尝试使用 Array.Copy 但它对我来说变得复杂而且我什么都不懂,我尝试将新索引移动到名称前面但后来意识到这会创建一个无限循环。如果地球上有变数或其他东西,请告诉我去哪里。如果需要进一步说明,请询问。我对 VB 还是很陌生,所以如果我不明白某些术语,请原谅我。

如果您为数据 (Objects and classes in Visual Basic), you can use LINQ (Introduction to LINQ in Visual Basic) 创建 class 以根据您喜欢的 属性 对其进行排序。

为了演示,为了简单起见,我将其制作为控制台应用程序,您将必须编写从文件中读取和解析数据的部分:

Module Module1

    Public Class Person
        Property Name As String
        Property Age As Integer
        Property Height As Integer
        Property Weight As Double

        Public Overrides Function ToString() As String
            Return String.Format("({0}: {1} years old, {2} mm, {3} kg)", Name, Age, Height, Weight)
        End Function

    End Class

    Public Sub ShowPeople(people As IEnumerable(Of Person))
        Console.WriteLine(String.Join(vbCrLf, people))

    End Sub

    Public Sub BubbleSortPeopleByName(ByVal people As List(Of Person))
        For i = 0 To people.Count - 2
            Dim doneSwap = False
            For j = i + 1 To people.Count - 1
                If people(i).Name > people(j).Name Then
                    Dim tmp = people(j)
                    people(j) = people(i)
                    people(i) = tmp
                    doneSwap = True
                End If
            Next
            If Not doneSwap Then Return
        Next

    End Sub

    Sub Main()
        Dim people As New List(Of Person)

        'TODO: Load the data from a file.
        people.Add(New Person With {.Name = "Monty Reyes", .Age = 28, .Height = 1700, .Weight = 70.7})
        people.Add(New Person With {.Name = "Kier Burke", .Age = 45, .Height = 1800, .Weight = 93.5})

        Console.WriteLine("Unsorted:-")
        ShowPeople(people)

        BubbleSortPeopleByName(people)

        Console.WriteLine("Sorted:-")
        ShowPeople(people)

        Console.ReadLine()

    End Sub

End Module

输出:

Unsorted:-
(Monty Reyes: 28 years old, 1700 mm, 70.7 kg)
(Kier Burke: 45 years old, 1800 mm, 93.5 kg)
Sorted:-
(Kier Burke: 45 years old, 1800 mm, 93.5 kg)
(Monty Reyes: 28 years old, 1700 mm, 70.7 kg)

Person class 有自己的 .ToString() 方法,可以轻松地将 Person 的实例显示为字符串。

ShowPeople 方法的参数是 people As IEnumerable(Of Person) 而不是 List(Of Person),因为 List 是 IEnumerable 但反之则不然,这使它更加通用。