【问题标题】:Array.Sort() doesn't correctly order target arrayArray.Sort() 没有正确排序目标数组
【发布时间】:2012-04-13 05:18:26
【问题描述】:

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

Array.sort() 并没有做该死的事情。事实上,该程序甚至没有像它应该的那样反转数组。我已经使用明确给出的名称和分数数组以这种方式测试了 array.sort() 并且它工作正常。我想它可能仍在以字符串形式读取数据,即使它被声明为其他方式,但是当我将数组类型更改为整数时它会四舍五入小数,所以我很确定不是这样。

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

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

【问题讨论】:

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


    【解决方案1】:

    highscores.Reverse() 不起作用,因为它返回反转数组而不是反转现有数组。要反转数组,请使用 Array.Reverse(highscores)。

    Array.Sort() 也适用于我的示例,因此很可能您的 highscores.txt 中有一些奇怪的东西。你能举一个这个文件的例子吗?

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

    【讨论】:

    • highscores.Reverse() 如果 OP 会从中创建一个新数组并将其分配给highscores 将起作用:highscores = highscores.Reverse().ToArray()
    • 非常感谢。我的 python 背景误导我使用 highscores.reverse() 而不是 array.reverse(highscores) 并且我在调试的压力/混乱下错误地格式化了我的 highscores.txt 文件。另外,为了将来参考,您提到的列表排序是否会像 array.sort 这样的字典对两个数组进行排序?
    • 是的,您可以使用 linq 和 zip(非常类似于 python zip)对两个列表进行排序,或者将它们组合到字典中。我将发布完整示例然后我可以访问 VS
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2021-12-31
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多