tagCANDY CGI VBレスキュー(花ちゃん) - 構造体配列のソート(VB.NET) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
構造体配列のソート(VB.NET)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

構造体配列のソート(VB.NET) [No.146の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2007/08/31 18:59
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[アルゴリズム][][]                                                  *
* キーワード:構造体,配列,ソート,並べ替え,,                                       *
***********************************************************************************

元質問:構造体配列のソートについて - タートル  2004/02/20-09:57 No.733

構造体配列を使用して複数キー指定でソートをしたいのですが(DBでいうORDER BY)
どなたかよい方法をご存知ないでしょうか?
単一キー指定のソートは普通のソートでできるのですが。。。。

-----------------------------------------------------------------------------------
Re: 構造体配列のソートについて - 魔界の仮面弁士  2004/02/20-12:55 No.734
-----------------------------------------------------------------------------------
構造体にIComparableインターフェイスを実装しておけば、呼び出し側は、
『  Array.Sort(構造体配列変数)  』の1行だけでソートを行えます。

Protected Friend Structure MyUDT : Implements System.IComparable
    Friend Code As Integer, Name As String
    Friend Sub New(ByVal Code As Integer, ByVal Name As String)
        Me.Code = Code
        Me.Name = Name
    End Sub
    Private Function CompareTo(ByVal obj As Object) _
                            As Integer Implements System.IComparable.CompareTo
        Dim cmp As Integer
        Try
            Dim X As MyUDT = DirectCast(obj, MyUDT)
            cmp = Me.Code.CompareTo(X.Code)
            If cmp = 0 Then
                cmp = Me.Name.CompareTo(X.Name)
            End If
            Return cmp
        Catch
            Return 0
        End Try
    End Function
End Structure
メンテ

Page: 1 |

構造体配列のソート(ソートのパターンを変更)(VB.NET)_1  (No.1の個別表示) [スレッド一覧へ]
日時: 2011/04/05 11:00
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[アルゴリズム][][]                                                  *
* キーワード:構造体,配列,ソート,並べ替え,,                                       *
***********************************************************************************

-----------------------------------------------------------------------------------
ソートのパターンを変更するコード - 特攻隊長まるるう  2004/03/18-17:53 No.779
-----------------------------------------------------------------------------------
興味があったのでちょっと触らせてもらいました。
大変勉強になりました。
タートルさん、魔界の仮面弁士さん、ありがとうございます。

    Private Sub Button2_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button2.Click
        Dim a(2) As MyUDT
        MyUDT.Pattern = 1
        a(0) = New MyUDT("CCC", "BBB")
        a(1) = New MyUDT("BBB", "AAA")
        a(2) = New MyUDT("A", "GGG")
        Array.Sort(a)
        MyUDT.Pattern = 2
        Array.Sort(a)
    End Sub

    Protected Friend Structure MyUDT : Implements System.IComparable
        Friend Code As String, Name As String
        Shared Pattern As Integer
        Friend Sub New(ByVal Code As String, ByVal Name As String)
            Me.Code = Code
            Me.Name = Name
        End Sub
        Private Overloads Function CompareTo(ByVal obj As Object) _
                               As Integer Implements System.IComparable.CompareTo
            Dim cmp As Integer
            Try
                Dim X As MyUDT = DirectCast(obj, MyUDT)
                Select Case Me.Pattern
                    Case 1
                        cmp = Me.Code.CompareTo(X.Code)
                        If cmp = 0 Then
                            cmp = Me.Name.CompareTo(X.Name)
                        End If
                        Return cmp
                    Case 2
                        cmp = Me.Code.CompareTo(X.Name)
                        If cmp = 0 Then
                            cmp = Me.Name.CompareTo(X.Code)
                        End If
                        Return cmp
                    Case Else
                        cmp = Me.Code.CompareTo(X.Code)
                        If cmp = 0 Then
                            cmp = Me.Name.CompareTo(X.Name)
                        End If
                        Return cmp
                End Select
            Catch
                Return 0
            End Try
        End Function

    End Structure



-----------------------------------------------------------------------------------

降順ソートの場合下記のようにソート後、Reverse する事で降順になります。
速度的に倍かかるように思われがちですが、条件等にもよりますが、誤差の範囲程度です。
(見た目では区別がつきません)

    Array.Sort(a)
    Array.Reverse(a)     'これを追加しても処理速度的にはあまり大差がない

                          ---- by 花ちゃん ----  

メンテ
構造体配列のソート(VB.NET)_2  (No.2の個別表示) [スレッド一覧へ]
日時: 2011/04/05 11:00
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[アルゴリズム][][]                                                  *
* キーワード:構造体,配列,ソート,並べ替え,,                                       *
***********************************************************************************

-----------------------------------------------------------------------------------
Re: 構造体のソートについて - ねろ  2005/05/31-11:42 No.1770
-----------------------------------------------------------------------------------

こんな方法もあるのかな。
Returnのところにブレイクポイントを置くとクイックソートやってるのがわかる。

Option Strict On
Imports System

  Private Structure CompanyStaff
    Implements IComparable
    Public Code, Name As String
    Public Function CompareTo(ByVal obj As Object) As Integer Implements _
           IComparable.CompareTo
      Return Me.Code.CompareTo(DirectCast(obj, CompanyStaff).Code)
    End Function
  End Structure

   '//以下単に確認のコード
  Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
    Dim Person As CompanyStaff()
    ReDim Person(3)
    Person(0).Code = "0004" : Person(0).Name = "すずき-0004"
    Person(1).Code = "0003" : Person(1).Name = "あらき-0003"
    Person(2).Code = "0005" : Person(2).Name = "やまだ-0005"
    Person(3).Code = "0006" : Person(3).Name = "たなか-0006"
    Console.WriteLine("ソート前")
    For Each w As CompanyStaff In Person
      Console.WriteLine(w.Name)
    Next
    Console.WriteLine("ソート後")
    Array.Sort(Person)
    For Each w As CompanyStaff In Person
      Console.WriteLine(w.Name)
    Next
  End Sub
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ