○VB.net 構造体のソートと検索

ロジックはクイックソートだと思われます
カスタム比較演算子を使用しています
ClassをStructureに読み変えても動きます

■構造体を入れたArrayListのソート

Module Module1
    Sub Main()
        Dim ar As New System.Collections.ArrayList

        ar.Add(New cell(5, "5です"))
        ar.Add(New cell(6, "6です"))
        ar.Add(New cell(7, "7です"))
        ar.Add(New cell(8, "8です"))
        ar.Add(New cell(9, "9です"))
        ar.Add(New cell(0, "0です"))
        ar.Add(New cell(1, "1です"))
        ar.Add(New cell(2, "2です"))
        ar.Add(New cell(3, "3です"))
        ar.Add(New cell(4, "4です"))

        ar.Sort(New testCompare) 'カスタム比較演算子を指定してソート

        Dim i As Integer
        For i = 0 To ar.Count - 1
            Console.WriteLine((CType(ar(i), cell)).str)
        Next
        Console.Read()
    End Sub
End Module

'カスタム比較演算子
Public Class testCompare : Implements System.Collections.IComparer
    Public Function Compare(ByVal right As Object, ByVal left As Object) As Integer Implements IComparer.Compare
        ' right > left	:	正の値を返す。
        ' right == left	:	0を返す。
        ' right < left	:	負の値を返す
        Return (CType(right, cell)).i - (CType(left, cell)).i
    End Function
End Class

Public Class cell
    Public i As Integer
    Public str As String
    Public Sub New(ByVal a As Integer, ByVal b As String)
        i = a
        str = b
    End Sub
End Class

処理結果
0です
1です
2です
3です
4です
5です
6です
7です
8です
9です

■構造体を入れたArrayListの検索

Module Module1
    Sub Main()
        Dim ar As New System.Collections.ArrayList

        ar.Add(New cell(5, "5です"))
        ar.Add(New cell(6, "6です"))
        ar.Add(New cell(7, "7です"))
        ar.Add(New cell(8, "8です"))
        ar.Add(New cell(9, "9です"))
        ar.Add(New cell(0, "0です"))
        ar.Add(New cell(1, "1です"))
        ar.Add(New cell(2, "2です"))
        ar.Add(New cell(3, "3です"))
        ar.Add(New cell(4, "4です"))

        ar.Sort(New testCompare) 'カスタム比較演算子を指定してソート BinarySearchはソートが必要

        Dim i As Integer = ar.BinarySearch(New cell(4, ""), New testCompare) 'カスタム比較演算子を指定して検索
        Console.WriteLine((CType(ar(i), cell)).str)

        Console.Read()
    End Sub
End Module

'カスタム比較演算子
Public Class testCompare : Implements System.Collections.IComparer
    Public Function Compare(ByVal right As Object, ByVal left As Object) As Integer Implements IComparer.Compare
        ' right > left	:	正の値を返す。
        ' right == left	:	0を返す。
        ' right < left	:	負の値を返す
        Return (CType(right, cell)).i - (CType(left, cell)).i
    End Function
End Class

Public Class cell
    Public i As Integer
    Public str As String
    Public Sub New(ByVal a As Integer, ByVal b As String)
        i = a
        str = b
    End Sub
End Class

処理結果
4です

■消去

Module Module1
    Sub Main()
        Dim ar As New System.Collections.ArrayList

        ar.Add(New cell(0, "0です"))
        ar.Add(New cell(1, "1です"))
        ar.Add(New cell(2, "2です"))
        ar.Add(New cell(3, "3です"))
        ar.Add(New cell(4, "4です"))

        ar.RemoveAt(3) 'ar(3)の値を消去 ar.Clear() にするとすべての値を消去します。

        Dim i As Integer
        For i = 0 To ar.Count - 1
            Console.WriteLine((CType(ar(i), cell)).str)
        Next
        Console.Read()
    End Sub
End Module

Public Structure cell
    Public i As Integer
    Public str As String
    Public Sub New(ByVal a As Integer, ByVal b As String)
        i = a
        str = b
    End Sub
End Structure

処理結果
0です
1です
2です
4です



▲トップページ > Visual BASIC と C#