- ベストアンサー
構造体を使っての集約、並べ替え方法
VB6.0で構造体を使っての集約、並べ替えはできるのでしょうか? 私がしたいのはtxtのシーケンシャルファイルを集約して並べ替えもしたいのですが上手いやり方が分かりません。 一度構造体にセットしてからなら出来るのではと考えたのですが、それ以上思いつきません。 効率の良い方法を教えてください。お願い致します。 実際にやりたい事 シーケンシャルファイルの1から5バイトをキーに10から15バイトを集約
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
興味がわいたので、下記URLを参考に作成してみました http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm 参考程度に... '構造体宣言 Private Type HOGE_HOGE hoge1 As Long hoge2 As Long hoge3 As Long End Type '変数宣言 Private hogehoge As HOGE_HOGE 'テストルーチン Private hoge_test() Dim i As Long 'hogehoge配列にデータ格納 *********** 'hogehoge配列ソート前 For i = 0 To Ubound(hogehoge) Step 1 Debug.Print "1:" & hogehoge(i).hoge1 & " 2:" & hogehoge(i).hoge2 & " 3:" & hogehoge(i).hoge3 Next i 'hogehoge配列ソート実行 Call QuickSorthogehoge(1, Ubound(hogehoge)) 'hogehoge配列ソート後 For i = 0 To Ubound(hogehoge) Step 1 Debug.Print "1:" & hogehoge(i).hoge1 & " 2:" & hogehoge(i).hoge2 & " 3:" & hogehoge(i).hoge3 Next i End Sub 'hogehoge配列クイックソート Private Sub QuickSorthogehoge(ByVal lngStart As Long, ByVal lngEnd As Long) Dim BaseHoge As HOGE_HOGE '基準値を格納する変数 Dim BuffHoge As HOGE_HOGE '値をスワップするための作業域 Dim lngBaseNumber As Long '中央の要素番号を格納する変数 Dim lngCounter As Long '格納位置カウンタ Dim i As Long 'ループカウンタ '終了番号が開始番号以下の場合、プロシージャを抜ける If lngStart >= lngEnd Then Exit Sub '中央の要素番号を求める lngBaseNumber = (lngStart + lngEnd) \ 2 '中央の値を基準値とする BaseHoge.hoge1 = hogehoge(lngBaseNumber).hoge1 BaseHoge.hoge2 = hogehoge(lngBaseNumber).hoge2 BaseHoge.hoge3 = hogehoge(lngBaseNumber).hoge3 '中央の要素に開始番号の値を格納 hogehoge(lngBaseNumber).hoge1 = hogehoge(lngStart).hoge1 hogehoge(lngBaseNumber).hoge2 = hogehoge(lngStart).hoge2 hogehoge(lngBaseNumber).hoge3 = hogehoge(lngStart).hoge3 '格納位置カウンタを開始番号と同じにする lngCounter = lngStart '開始番号の次の要素から終了番号までループ For i = (lngStart + 1) To lngEnd Step 1 '値が基準値より小さい場合 If hogehoge(i).hoge2 < BaseHoge.hoge2 Then '格納位置カウンタをインクリメント lngCounter = lngCounter + 1 '値をスワップ BuffHoge.hoge1 = hogehoge(lngCounter).hoge1 BuffHoge.hoge2 = hogehoge(lngCounter).hoge2 BuffHoge.hoge3 = hogehoge(lngCounter).hoge3 hogehoge(lngCounter).hoge1 = hogehoge(i).hoge1 hogehoge(lngCounter).hoge2 = hogehoge(i).hoge2 hogehoge(lngCounter).hoge3 = hogehoge(i).hoge3 hogehoge(i).hoge1 = BuffHoge.hoge1 hogehoge(i).hoge2 = BuffHoge.hoge2 hogehoge(i).hoge3 = BuffHoge.hoge3 End If Next i 'hogehoge(lngCounter) を開始番号の値にする hogehoge(lngStart).hoge1 = hogehoge(lngCounter).hoge1 hogehoge(lngStart).hoge2 = hogehoge(lngCounter).hoge2 hogehoge(lngStart).hoge3 = hogehoge(lngCounter).hoge3 '基準値を hogehoge(lngCounter) に格納 hogehoge(lngCounter).hoge1 = BaseHoge.hoge1 hogehoge(lngCounter).hoge2 = BaseHoge.hoge2 hogehoge(lngCounter).hoge3 = BaseHoge.hoge3 '分割された配列をクイックソート(再帰) Call QuickSorthogehoge(lngStart, lngCounter - 1) '分割された配列をクイックソート(再帰) Call QuickSorthogehoge(lngCounter + 1, lngEnd) End Sub
その他の回答 (1)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
集約は置いといて 簡単に並べ替えをするならリストボックスが使えます。 Sortプロパティ(だったと思う)をTrueにしたリストボックスに シーケンシャルファイルから読みこんだデータをどんどん追加し、 ファイルが終わったらリストボックスの中に並べ替えられたデータが入っています。 ここまでくれば集約はそんなに大変じゃないと思います。
お礼
ありがとう御座います。参考にさせていただきます。
補足
リストボックスはformを使用しないと使えないのでしょうか?basファイルだけでの作成はどのようにすれば出来ますでしょうか?
お礼
コーディングまでして頂きありがとう御座います。 大変勉強になりました。 VBを始めて間もないのですが、テキストファイルでのソートやグルーピングでお困りの方は多いのではと思います。