在 Visual Basic 中将项从文本文件添加到多维数组中



我有这个文本文件:

Paul George|2.87|29
Stephen Curry|2.85|28
Jamal Murray|2.72|21
PJ Tucker|2.72|11
Kyle Lowry|2.61|15
Game
Paul George|g2d|g2p
Stephen Curry|g2d|g2p
Jamal Murray|g2d|g2p
PJ Tucker|g2d|g2p
Kyle Lowry|g2d|g2p
Game
Paul George|g3d|g3p
Stephen Curry|g3d|g3p
Jamal Murray|g3d|g3p
PJ Tucker|g3d|g3p
Kyle Lowry|g3d|g3p
Game
Paul George|g4d|g4p
Stephen Curry|g4d|g4p
Jamal Murray|g4d|g4p
PJ Tucker|g4d|g4p
Kyle Lowry|g4d|g4p

我想将项目添加到数组中

Names(name, gamenumber)
Distance(distance, gamenumber)
Points(Points, gamenumber)

第一个索引是玩家的数据,第二个索引是数据来自的游戏

例如

distance(1, 0) = 2.87
distance(5, 0) = 2.61
distance(1, 1) = g2d

以便索引与给定游戏编号的玩家匹配。

到目前为止,我有:

Private Sub openFile_Click(sender As Object, e As EventArgs) Handles openFile.Click
OpenFileDialog.ShowDialog()
Dim strFileName = OpenFileDialog.FileName
Dim objReader As New System.IO.StreamReader(strFileName)
Dim textline As String

Dim Names(100, 3) As String
Dim Distance(100, 3) As String
Dim Points(100, 3) As String
Dim Count As Integer = 0
Dim GameNumber As Integer = 0

Do While objReader.Peek() <> -1
textline = objReader.ReadLine() & vbNewLine
If textline = "Game" Then
GameNumber = GameNumber + 1
Else
Dim parts() As String = textline.Split("|")

Names(Count, GameNumber) = parts(0)
Distance(Count, GameNumber) = parts(1)
Points(Count, GameNumber) = parts(2)
Count = Count + 1
End If
Loop
End Sub

每行的各个部分由 | 拆分,将它们分成"部分",然后将从该行获得的三个部分(玩家名称、距离和点)分配给单独的数组中,作为

Names(<Name>, 0)
Distance(<Distance>, 0)
Points(<Points>, 0)

它继续沿着文本文件向下,但如果行 = "游戏",它应该递增 GameNumber,然后移动到下一行,继续添加数据,而不是作为

Names(<Name>, 1)
Distance(<Distance>, 1)
Points(<Points>, 1)

等等,但我的代码不起作用。完成此操作后,我不会在列表框中为页面上的玩家打印所需的游戏统计信息,如下所示:

For n = 0 To Count - 1
lstNames.Items.Add(Names(n, GameWanted))
lstNames.Items.Add(" ")
lstDistance.Items.Add(Distance(n, GameWanted) + " Miles")
lstDistance.Items.Add(" ")
lstPoints.Items.Add(Points(n, GameWanted))
lstPoints.Items.Add(" ")
Next

如果您创建一个代表玩家的类并使用字典对它们进行索引,这将变得容易得多

Class Player
Public Property Distances as List(Of Decimal)
Public Property Points as List(Of Integer)
Public Property Name as String
Public Sub New(n as String)
Name = n
Distances = New List(of Decimal)
Points = New List(of Integer)
End sub 
End class

然后在读取文件的方法中:

Dim d as new Dictionary(of String, Person)
ForEach line as String in File.ReadAllLines(...)
Dim bits = line.Split("|"c)
If bits.Length < 3 Then Continue For
If Not d.ContainsKey Then d.Add(bits(0), New Person(bits(0))
Dim p = d(bits(0)) 'retrieve the old or just added person
p.Distances.Add(decimal.parse(bits(1)))
p.Points.Add(integer.parse(bits(2)))
Next line

注意;我是一名 c# 程序员,很少再做 vb。我使用从 0 开始的数组索引进行编码,如果您使用的是 1 个基本索引,请在上面的索引中添加一个。此代码可能应被视为伪代码;它是从 5 年前对 VB 外观的记忆中写在手机上的,并且可能有大量 VB 语法错误(对不起)或者花很长的路来做我们这些天有较短的 sybtax 的事情(列表初始化器等)

在这个循环遍历所有文件结束时,您将拥有您的人员字典,遇到的每个名字一个。每个人都会有一个分数和距离的列表。如果要将它们相加或平均,请向 person 类添加一个函数,该函数迭代列表并返回结果,并将它们全部打印出来,请执行

foreach s as string in d.Keys
Console.Write(d(s).Name & " got avg distance " & d(s).GetAverageDist())

或类似

要打印出它们的所有距离:

foreach s as string in d.Keys
foreach dis as decimal in d(s).Distances
Console.Write(d(s).Name & " got distance " & dis)

这是面向对象的编程;我们使用类来表示事物并做有用的事情来模拟世界。我们不会尝试在 20 个不同的数组中收集数据并将其与索引等绑定在一起 - 这是一种非常程序化的代码思维方式,与 vb.net 的发明相反。

实际上,这很可能没有找到适当的解决方案,而且也有些虚伪,因为我使用两个列表来跟踪距离和点,并断言列表索引相等 - 索引 3 处的距离和索引 3 处的点来自游戏 4(从零开始的索引注释)

我们真正应该做的是定义一个 GameResult 类,它具有距离、点数和游戏号的属性,然后每个人类都有一个 List(of GameResult) - person 可以有一个函数,为该人返回格式良好的记分卡 - 这是正确的 OO :)

相关内容

  • 没有找到相关文章

最新更新