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 但反之则不然,这使它更加通用。
只是想问一个关于在排序算法中一次移动数组的多个索引的问题。
基本上,我使用冒泡排序算法(在 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 但反之则不然,这使它更加通用。