• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ソート処理について)

ソート処理について知りたい!

このQ&Aのポイント
  • ソート処理についての質問です。フローチャートが書けず、困っています。
  • 個人成績表からレコードを取得し、点数の高い順にソートする方法を教えてください。
  • VB初心者です。ソートの種類や使い分けについても教えていただけると嬉しいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Option Explicit On Option Compare Binary Option Strict On Option Infer Off 'シンプルにしようとしたら中級者以上向けのコードになった気がします '>レコードを取り込む際に件数をカウントし 'そんな事はしない。Listに格納しておいてからCountを呼び出した方が簡単 Class Person Private PersonName As String Private PersonScore As Integer Public Sub New(n As String,s As Integer) PersonName = n PersonScore = s End Sub 'ReadOnlyにする必要はそれほどないかも Public ReadOnly Property Name As String Get return PersonName End Get End Property Public ReadOnly Property Score As Integer Get return PersonScore End Get End Property End Class Class PersonScoreComparer Implements System.Collections.Generic.IComparer(Of Person) Public Function Compare(p1 As Person,p2 As Person) As Integer Implements System.Collections.Generic.IComparer(Of Person).Compare Return p1.Score - p2.Score End Function End Class '分ける必要あったかな… Class PersonsFileLoader 'ファイルのValidatorは別途必要 Shared Function Load(filename As String) As System.Collections.Generic.List(Of Person) 'UTF-16LE '1.使いたい文字がないという状況を避けたい '2.BOMがあるかないかで議論したくない '3.UTF-32はバグがある実装が多いらしい '4.Intel系のCPUはLittle Endianらしい Dim x As System.IO.StreamReader = New System.IO.StreamReader(filename,System.Text.Encoding.GetEncoding(1200)) Dim Persons As System.Collections.Generic.List(Of Person) = New System.Collections.Generic.List(Of Person) While Not x.EndOfStream Dim s As String = "" s = x.ReadLine() Persons.Add(New Person(s.Substring(0,10).Trim(new Char(){" "C}),Integer.Parse(s.Substring(10,3)))) End While Return Persons End Function End Class Class Q4920320A Shared Sub Main Dim ps As System.Collections.Generic.List(Of Person) = PersonsFileLoader.Load("aaa.txt") '場合によって大きいものにしたり小さいものにしたりすると混乱するので '作るComparerは常に小さい順と心がけたいと思っているのでわざわざReverseしている。 ps.Sort(New PersonScoreComparer()) ps.Reverse() For i As Integer = 0 To ps.Count - 1 System.Console.WriteLine((i + 1).ToString().PadLeft(3,"0"C) & ps(i).Name.PadRight(20," "C) & ps(i).Score.ToString().PadLeft(3,"0"C)) Next System.Console.ReadKey(true) End Sub End Class

tao0417
質問者

補足

回答ありがとうございます。 プログラミングに関して、ずぶの素人なので論点がずれてしまうかもしれないのですが、 この課題以外を解く際に Private Sub コマンド0_Click() '変数の宣言 Dim INP_DATA As String Dim OUT_STRINGS As String Dim shohin As String Dim kubun As String Dim tanka As String のような感じで始まり 「IF」や「DO…LOOP」などを使って 解いてきたのですが、今回の問題はそのようなステートメントを 用いて解くことはできないでしょうか? 「GET」などはまだ使ったことがないため、できることなら、 今まで使ってきたもので解けないかと考えています。 せっかくお答えいただいたのに、申し訳ありません。 よろしくお願いいたします。

その他の回答 (2)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

何か、決まった、雛形があるのですか。??? 後出しは、一番嫌われますよ。 そもそも、VBのバージョンは、何ですか???

tao0417
質問者

補足

後出し? すいません。どのように質問を書けばいいか分からず 課題をそのまま書いただけなので、不十分な点があり ご迷惑をおかけしてしまいました。 申し訳ありません。 MSのAccessのでコマンドを作成して、イベントのビルドで コーディングを作っていくというのがそもそもなのですが、 バージョンはどこを見れば確認できるのでしょうか? これ以上質問ばかりしますと、お気に触るかと思いますので、 また改めて質問を投稿させていただきます。 ご迷惑をおかけしました。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

これでは、駄目なの??? Dim alist As New ArrayList alist.Add("076/青木") alist.Add("081/井上") alist.Add("066/江藤") alist.Add("092/柏原") alist.Add("087/小林") alist.Add("059/斉藤") alist.Add("076/佐久間") alist.Add("088/関根") alist.Add("096/塚田") alist.Add("083/富田") alist.Sort() For i As Integer = 0 To alist.Count - 1 Dim c() As String = alist.Item(alist.Count - i - 1).ToString.Split("/") Debug.Print((i + 1).ToString + "番目  : 名前 " + c(1).ToString + " : 点数" + c(0).ToString) Next 出力結果 1番目  : 名前 塚田 : 点数096 2番目  : 名前 柏原 : 点数092 3番目  : 名前 関根 : 点数088 4番目  : 名前 小林 : 点数087 5番目  : 名前 富田 : 点数083 6番目  : 名前 井上 : 点数081 7番目  : 名前 青木 : 点数076 8番目  : 名前 佐久間 : 点数076 9番目  : 名前 江藤 : 点数066 10番目  : 名前 斉藤 : 点数059

tao0417
質問者

補足

ご回答ありがとうございます。 教えていただいたのを実行してみたのですが 【ユーザー定義型は定義されていません】 と出てしまって実行できない状況です。 実行に時間がかかってかまわないので、 '変数の宣言 Dim INP_DATA As String Dim jyuni_01 As Integer Dim simei_01 As String Dim ten_01 As String 'ファイルを開く Open "C:\INFILE.txt" For Input As #1 Open "C:\05_OUTFILE.txt" For Output As #2 'ファイルの最後までループ Do Until EOF(1) Line Input #1, INP_DATA simei(i) = Left(INP_DATA, 10) tensu(i) = Right(INP_DATA, 3) '順番に増やしていく i = i + 1 Loop といった感じでSortを使わず、一つ一つ大小を比べていき 並べ替えることは可能でしょうか?