Добавление элементов в многомерный массив из текстового файла в Visual Basic - PullRequest
0 голосов
/ 22 июня 2019

У меня есть этот текстовый файл:

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)

Он продолжается вниз по текстовому файлу, но если строка = "Game", он должен увеличить значение 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

1 Ответ

0 голосов
/ 22 июня 2019

Это стало бы намного проще, если бы вы создали класс, представляющий вашего игрока, и проиндексировали их словарем

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 (извините) или делать долгий путь, чтобы сделать то, что у нас в настоящее время имеет более короткие сибаксисы (инициализаторы списка и т. д.) )

В конце этого цикла по всему файлу у вас будет словарь ваших людей, по одному на каждое имя. У каждого человека будет список очков и расстояний. Если вы хотите добавить их или усреднить их, добавьте функцию к классу персонажа, который выполняет итерации по списку и возвращает результат, и для их распечатки выполните

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, и у него есть свойства расстояния, точек и gamenumber, тогда у каждого класса персонажа есть один список (из GameResult) - у человека может быть функция, которая возвращает красиво отформатированную карточку результата. для этого человека - это правильно ОО:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...