VB.NET 配列のカスタムソート
(Visual Studio 2015 版)

投稿日 2016/05/08

[Home] 

はじめに

配列 (一般にはコレクション) には Sort メソッドがあって標準的な並べ替えができます。例えば、整数の配列なら小さい順で並べ替えができます。しかし、標準以外の並べ替えを行おうとすると、配列の要素を比較するためのクラスが必要になります。

このクラスは IComparer インターフェースを実装する必要があります。このクラスには必ず Compare メソッドの実装が必要で、そのメソッドで2つのオブジェクト(配列の要素に相当)を比較する必要があります。比較結果(戻り値)は整数で正なら第1パラメータが大きい、零なら2つのパラメータが等しい、負なら第1パラメータが小さいという意味になります。

 

サンプル

次のサンプルは、AWS のキーを保持する配列を並べ替えるものです。並べ替えはフォルダ優先で深さが浅い順で名前に関しては ABC 順になります。


メインプログラム

Module Module1

    Sub Main()
        ' 並べ替え対象配列
        Dim keys As String() = {"data/", "data/apps.db", "data/dvd.db", "data/memo.db", "error.html", "index.html","temp/", "temp/FileUpload.cgi", "temp/test.png",
         "wiki/", "wiki/img/", "wiki/img/tiobe.png", "wiki/img/tiobe_ruby.png", "wiki/img/tutor.png", "wiki/img/contact.png"}

        ' 配列を比較用クラス Compare1 を使って並べ替える。
        Array.Sort(keys, New Compare1)

        ' 結果を表示
        For Each key As String In keys
            Console.WriteLine(key)
        Next

#If DEBUG Then
        Console.ReadKey()
#End If
    End Sub

End Module

比較クラス

''' <summary>
''' オブジェクト比較用のクラス
''' </summary>
Public Class Compare1
    Implements IComparer  ' IComparer を実装する。

    ''' <summary>
    ''' Compare メソッド (必ず実装する)
    ''' </summary>
    ''' <param name="x"></param>
    ''' <param name="y"></param>
    ''' <returns></returns>
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
        Dim sx As String = CStr(x)
        Dim sy As String = CStr(y)
        Return getSlashCount(sx) - getSlashCount(sy)
    End Function

    ''' <summary>
    ''' "/" の数を数える。
    ''' </summary>
    ''' <param name="key"></param>
    ''' <returns></returns>
    Private Function getSlashCount(ByVal key As String) As Integer
        Dim count As Integer = 0
        For i As Integer = 0 To key.Length - 1
            If key(i) = "/" Then
                count += 1
            End If
        Next
        If key.EndsWith("/") Then
            count -= 2
        End If
        Return count
    End Function
End Class

 

 


 

 開設 2014年12月   著作権 2014-2016 bonk.red  連絡先: こちらからメッセージを送ってください(お仕事も大募集)