2012-04-13 23 views
1

次のコードを使用して、スコアが最初に書き込まれ、プレーヤーの名前が次の行に書き込まれたハイスコアファイルを読み込み、次に上位3スコアファイルに3つのスコアが書き込まれていない場合はそれ以下である。ハイスコ​​アの表示は、このプログラムが実装しようとしているように、スコアが最初に最も高い順にソートされます。Array.Sort()は正しくターゲット配列を順序付けしていません

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 

答えて

1

highscores.逆転していない逆配列が返されるため、逆数()は機能しません。配置を逆にするには、Array.Reverse(ハイスコア)を使用します。

また、Array.Sort()は私の例でうまくいくので、おそらくあなたはhighscores.txtに何か変なことがあります。このファイルの例を挙げることができますか?

また、各繰り返しで配列のサイズを変更することは、遅くて大量のメモリを消費するため、悪い考えです。 Listを使う方がいいです。リストは簡単にhighscores.OrderBy(i => i)(c#の構文)のようなlinqでソートすることができます。

+1

OPが新しい配列を作成し、それを 'highscores'に割り当てると、' highscores.Reverse() 'が動作します:' highscores = highscores.Reverse()。ToArray() ' –

+0

ありがとう、ありがとうございます。私のpythonの背景は、array.reverse(ハイスコア)ではなく、highscores.reverse()を使って私を誤ってしまい、デバッグのストレス/混乱の下でhighscores.txtファイルをフォーマットしました。また、将来の参照のために、array.sortのような辞書のように2つの配列を並べ替えると述べたソートを並べ替えるのですか? – sajattack

+0

はい、linq with zip(Python zipに非常によく似ています)または辞書を組み合わせて2つのリストをソートできます。私は完全な例を投稿し、私はVSにアクセスする – Nikolay

関連する問題