Array.Sort()未正确排序目标数组

时间:2012-04-13 05:18:27

标签: .net vb.net visual-studio-2010 file-io

我正在使用以下代码读取高分文件,首先写入分数,将玩家姓名写入下一行,如果没有写入3分,则显示前3分或更少分数文件。高分显示应该将分数排在最高的第一位,这是该程序试图实现的内容。

Array.sort()没有做该死的事。事实上,该程序甚至没有像它应该那样反转阵列。我用这种方式测试了array.sort(),明确给出了名称和得分数组,它运行正常。我想也许它仍然是以字符串的形式读取数据,即使它已经声明了,但是当我将数组类型更改为Integer时,它会将小数点数舍入,所以我很确定它不是那样的。

我不知道为什么从文件中读取数据会改变它的排序方式。我的老师也不明白发生了什么。有谁知道这里发生了什么?

Imports System.IO

Public Class Form2

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fileLines() = File.ReadAllLines(Application.StartupPath & "/../../Resources/highscores.txt")
        Dim highscores() As Double = {}
        Dim names() As String = {}
        'For some reason vb doesn't have a function to add items to arrays.
        'Lists have this capability, but if I used a list I couldn't use array.sort
        For i As Integer = 0 To fileLines.Length() - 1
            If (i Mod 2 = 0) Then
                'highscores.add(fileLines(i))
                Array.Resize(highscores, highscores.Length + 1)
                highscores(highscores.Length - 1) = fileLines(i)
            Else
                'names.add(fileLines(i))
                Array.Resize(names, names.Length + 1)
                names(names.Length - 1) = fileLines(i)
            End If
        Next
        Array.Sort(highscores, names)
        highscores.Reverse()
        names.Reverse()
        If highscores.Length() > 0 Then
            Label1.Text = Str(highscores(0)) + " " + names(0)
        End If
        If highscores.Length() > 1 Then
            Label2.Text = Str(highscores(1)) + " " + names(1)
        End If
        If highscores.Length() > 2 Then
            Label3.Text = Str(highscores(2)) + " " + names(2)
        End If
    End Sub

End Class

1 个答案:

答案 0 :(得分:1)

highscores.Reverse()不起作用,因为它返回反向数组而不反转现有数组。要在适当的位置反转数组,请使用Array.Reverse(highscores)。

此外,Array.Sort()在我的示例中运行良好,所以很可能你的highscores.txt中有一些奇怪的东西。你能给出一个这个文件的例子。

同样在每次迭代时调整数组大小是个坏主意,因为它很慢并浪费了大量内存。你最好使用List。列表可以使用linq轻松排序​​,如highscores.OrderBy(i => i)(c#语法)。