構造体の並べ替えを高速に行うには?(その2)


.net初心者  2006-03-29 07:35:50  No: 94810

前回スレ
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200603/06030047.txt
の続きでお願いします。

前回すれの添付URLの内容が高度でついていけませんでしたので、
再度具体例で教えていただきたくお願いいたします。

下記のような構造体があった場合に、System.Arrayを用いて、
これを日付の昇順(要するに上記の逆)に並べる場合には、
どうすればいいですか?

また、それによって並べ替えられた構造体配列は、構造体配列
そのものが並べ替えられたものとなるのか、それとも別途新しい
配列に代入しなおす必要があるのか、教えてください。

よろしくお願いします。

Structure myStock
    Dim DataDate As Date
    Dim Open As Double
    Dim High As Double
    Dim Low As Double
    Dim Close As Duble
    Dim Volume As Double
End Structure

Dim Stock as myStock

Stock(1).DataDate = 2006/02/03
Stock(2).DataDate = 2006/02/02
Stock(3).DataDate = 2006/02/01


我龍院忠太  2006-03-29 17:24:24  No: 94811

再度具体例で教えていただきたくお願いいたします。
どこかで書いた気がするのですが、実際のコードは下の様になります。
実装については説明しきれませんので自分で調べて下さい。

>また、それによって並べ替えられた構造体配列は、構造体配列
>そのものが並べ替えられたものとなるのか、それとも別途新しい
>配列に代入しなおす必要があるのか、教えてください。
前者ですね。

#当方Date型は詳しくないので、日付の代入方法は参考程度に。

Option Strict On
Imports System
Public Class Form1
        Structure myStock
              Implements IComparable
              Public DataDate As Date
              Public Open, High, Low, Close, Volume As Double
              Public Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo
                     Return Me.DataDate.CompareTo(DirectCast(obj, myStock).DataDate)
              End Function
         End Structure
         Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
              Dim Stock As myStock()
              ReDim Stock(2)
              Stock(0).DataDate = New Date(2006, 2, 3)
              Stock(1).DataDate = New Date(2006, 2, 2)
              Stock(2).DataDate = New Date(2006, 2, 1)
              '取り出しサンプルと単なる確認
              Array.Sort(Stock)
              For Each obj As myStock In Stock
                   Console.WriteLine(obj.DataDate)
              Next
         End Sub
End Class


我龍院忠太  2006-03-29 17:26:32  No: 94812

> '取り出しサンプルと単なる確認
の位置間違った!
Array.Sort(Stock)
こ、これがソートの部分です。orz


.net初心者  2006-03-30 04:01:20  No: 94813

我龍院忠太様
ご回答ありがとうございます。
お教えいただいた方法だと、昇順になりましたが、降順の場合は、
Array.Reverse(Stock)でよろしいのでしょうか?

それから、今回は構造体ということでしたが、これが通常の配列の場合は
どのようにコーディングすればよろしいでしょうか?
具体的には、
Dim Stock(10,3) As Variant
Stock(1,1) = 2006/02/03
Stock(2,1) = 2006/02/02
Stock(3,1) = 2006/02/01
の場合です。
よろしくお願いします。


魔界の仮面弁士  2006-03-30 06:09:18  No: 94814

> お教えいただいた方法だと、昇順になりましたが、降順の場合は、
> Array.Reverse(Stock)でよろしいのでしょうか?
それで良いかと。
http://ja.gotdotnet.com/quickstart/howto/doc/sort.aspx

> それから、今回は構造体ということでしたが、これが通常の配列の場合は
> どのようにコーディングすればよろしいでしょうか?
何も変わりません。
「構造体の配列」なら、構造体に IComparable を実装させましたが、
「クラスの配列」なら、クラスに IComparable を実装させるだけです。

また、列挙型の配列や文字列型の配列などは、既に IComparable が実装されて
いますので、そのまま Sort メソッドに渡す事ができます。

> Dim Stock(10,3) As Variant
どういう意味でしょう? 今は、VB.NET の話をしていると思ったのですが…。

> Stock(1,1) = 2006/02/03
これだと割り算として、334.33333…の意味になってしまうような。


我龍院忠太  2006-03-30 06:36:28  No: 94815

今日はコンピューターの調子が悪くて、.NETが立ち上がりません。
確認してないのですが.....

>お教えいただいた方法だと、昇順になりましたが、降順の場合は、
>Array.Reverse(Stock)でよろしいのでしょうか?
それでもいいですが、実装を少し変えて、
      Return Me.DataDate.CompareTo(DirectCast(obj, myStock).DataDate)
                                ↓
      Return DirectCast(obj, myStock).DataDate.CompareTo(Me.DataDate)
でいいはず、多分。

多次元配列のソートは「いったいどの次元をキーにしてソートしたらいいの」と言う
永遠の課題があり、素直には出来ないのです。

それと
Stock(1,1) = 2006/02/03
ですが、「/」は除算演算子ですよね、334.333333333333がStock(1,1) に
代入されますが。(^^;


我龍院忠太  2006-03-30 06:40:23  No: 94816

書いているうちに被ってしまった。


.net初心者  2006-03-30 06:42:26  No: 94817

回答ありがとうございます。

失礼しました。例は以下の通りです。
Dim Stock(10,3) As Object
Stock(1,1) = Datevalue("2006/02/03")
Stock(2,1) = Datevalue("2006/02/02")
Stock(3,1) = Datevalue("2006/02/01")

よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加