Загрузка файла в массив с сортировкой по возрастанию - PullRequest
0 голосов
/ 24 июня 2018

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

    Dim FileNum As Integer = FreeFile()

    FileOpen(FileNum, "GameResultsFile", OpenMode.Input)

    For index = 0 To 99
        Dim temp() As String = LineInput(FileNum).Split(",") 'CUTTING LINE INTO TWO SECTIONS


        MemoryGame.HighScores(index).Name = temp(0) 'NAME (First Part of Line)
        MemoryGame.HighScores(index).Score = temp(1) 'SCORE (Second Part of Line)

        If temp(1) > 0 Then 'If any of the scores is above 0 then
            ListBox1.Items.Add(temp(0) + " " + temp(1)) ' display the name of the person who got that score and their score
        End If




    Next
    FileClose()

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Как насчет попробовать это?

Dim sortedArray = _
    File _
        .ReadAllLines("GameResultsFile") _
        .Select(Function (line) line.Split(","c)) _
        .Select(Function (parts) New With { .Name = parts(0), .Score = Integer.Parse(parts(1)) }) _
        .OrderByDescending(Function (x) x.Score) _
        .Select(Function (x) x.Name & " " & x.Score)
        .ToArray()

For Each item As String In sortedArray
    ListBox1.Items.Add(item)
Next
0 голосов
/ 25 июня 2018

Комментарии и пояснения в строке

'Note Imports System.IO
    Structure Player
        Public Score As Integer
        Public Name As String
        'Added a constructor to the structure to make it easy to add new Player
        Public Sub New(myScore As Integer, myName As String)
            Score = myScore
            Name = myName
        End Sub
    End Structure

    Private HighScores(99) As Player

    Private index As Integer 'used in both LoadArray and SortAndDisplayArray

    Private Sub LoadArray()
        Using sr As New StreamReader("GameResultsFile.txt")
            Dim line As String
            Do While sr.Peek() > -1 'Peek checks if there is another character in the file
                line = sr.ReadLine()
                Dim temp() As String = line.Split(","c) 'CUTTING LINE INTO TWO SECTIONS
                'Notice the elements of the temp array are switched to match the
                'Player constructor (Sub New)
                HighScores(index) = New Player(CInt(temp(1)), temp(0))
                index += 1 'not only keeps track of the index but remembers how many elements
                'we have added to HighScores
            Loop
        End Using
    End Sub

    Private Sub SortAndDisplayArray()
        'This is the LINQ way to do it, you can do a great deal in one line of code
        'There is a loop underneath but you don't have to write it.
        'I added a Take clause so we will not get a bunch of 0- in the list box going up to index 99
        ' You might want to show, for example only the top ten scorers, so change to Take 10
        Dim orderArray = From scorer In HighScores Order By scorer.Score Descending Select $"{scorer.Score} - {scorer.Name}" Take index
        ListBox1.DataSource = orderArray.ToList
    End Sub

Я все еще думаю, что List (Of T) будет проще, но я чувствую, что ваше назначение требует от вас использования массива.

0 голосов
/ 24 июня 2018

Я бы сделал это примерно так, используя IComparable

Сначала я хотел бы загрузить данные из вашего текстового файла и сохранить их в Списке * 1006.* и типом будет класс Player ниже.

    '' Get Data From Text File And Create An Anonymous Type
    Private Sub LoadPlayerAndScore(path As String)

    '' Load data from text file
    Dim data = From line In System.IO.File.ReadAllLines(path)
               Let val = line.Split(",")
               Select New With {Key .Name = val(0), Key .Score = val(1)}

    '' Save data to list
    For Each pair In data
        Dim player As New Player With {
            .Name = pair.Name,
            .Score = pair.Score
        }
        playersList.Add(player)
    Next

End Sub

Затем я продолжу создавать класс игрока, который будет реализовывать ICompareble, перечисленный выше.

Class Player
Implements IComparable(Of Player)
Public Property Name As String
Public Property Score As Integer

Public Sub Player(ByVal name As String, ByVal score As Integer)
    Me.Name = name
    Me.Score = score
End Sub

'' Sort Player From The Hightest Score To The Lowest Score
Private Function IComparable_CompareTo(other As Player) As Integer Implements IComparable(Of Player).CompareTo
    Return other.Score.CompareTo(Me.Score)
End Function
End Class

Затем я создал бы некоторые открытые переменные, такие как

Dim playersList As New List(Of Player)
Dim fileLocation As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Settings.txt")

Измените путь к местоположению вашего файла.

И, наконец, в Событие загрузки формы
Я бы назвал все это так

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    '' Load Data From Text File On Desktop
    LoadPlayerAndScore(path:=fileLocation)

    '' Sort List
    playersList.Sort()

    '' Add Values To List
    For Each p As Player In playersList
        ListBox1.Items.Add("Name: " + p.Name + " Score: " + p.Score.ToString())
    Next

End Sub

Вот как код должен выглядеть примерно так

Public Class Form1
Dim playersList As New List(Of Player)
Dim fileLocation As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Settings.txt")

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    '' Load Data From Text File On Desktop
    LoadPlayerAndScore(path:=fileLocation)

    '' Sort List
    playersList.Sort()

    '' Add Values To List
    For Each p As Player In playersList
        ListBox1.Items.Add("Name: " + p.Name + " Score: " + p.Score.ToString())
    Next

End Sub
'' Get Data From Text File And Create An Anonymous Type
Private Sub LoadPlayerAndScore(path As String)

    '' Load data from text file
    Dim data = From line In System.IO.File.ReadAllLines(path)
               Let val = line.Split(",")
               Select New With {Key .Name = val(0), Key .Score = val(1)}

    '' Save data to list
    For Each pair In data
        Dim player As New Player With {
            .Name = pair.Name,
            .Score = pair.Score
        }
        playersList.Add(player)
    Next

End Sub
End Class

Class Player
Implements IComparable(Of Player)
Public Property Name As String
Public Property Score As Integer

Public Sub Player(ByVal name As String, ByVal score As Integer)
    Me.Name = name
    Me.Score = score
End Sub
'' Sort Player From The Hightest Score To The Lowest Score
Private Function IComparable_CompareTo(other As Player) As Integer Implements IComparable(Of Player).CompareTo
    Return other.Score.CompareTo(Me.Score)
End Function
End Class

Вот вывод, который я получил
Results

И вот как выглядели данные текстовых файлов.
ANDREW,25
MERVE,12
RUZGAR,50
А для десяти лучших людей следуйтекомментарии выше.

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