3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)Array.Sort() で比較条件をオリジナルなものにする

配列でソートするって手動でやるとかなりめんどくさいですが、.Net には Sort() メソッドが追加されており、簡単にソートができるようです。

数値型や文字列型の基本クラスを使った配列には何もしなくても、Array.Sort(配列名) でソートできます。

ただ、並び替えのルールを自分で定義したい時もありますよね。

IComparer インターフェイスの Compare メソッドを実装したメソッドを作り、Array.Sort の引数に渡してやればいいそうです。

ということで、あるフォルダのファイル名を文字列として取得しソートするコード書いてみました。

このファイルには拡張子の前に2桁の数値があり、この数値の昇順でソートするという要件です。

コードは下記のようになります。

Public Class Form1

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'任意のフォルダのファイル名取得

Dim fileArray As String() = IO.Directory.GetFiles("c:\test")

'ソート前の配列出力

Console.WriteLine("ソート前")

For Each file As String In fileArray

Console.WriteLine(file)

Next

 

'ソートに使う比較クラスインスタンス生成

Dim fileNameComp As IComparer = New FileNameComp()

'ソート

Array.Sort(fileArray, fileNameComp)

'ソート後の配列出力

Console.WriteLine("ソート後")

For Each file As String In fileArray

Console.WriteLine(file)

Next

End Sub

 

'''

''' ソートの際比較するための IComparer を実装したクラス

'''

'''

Public Class FileNameComp

Implements IComparer

 

'''

''' ソートの際比較に使う IComparer.Compare を実装したメソッド。

''' ファイル名の末尾2ケタの数値の大小で比較する。

'''

''' 比較オブジェクト

''' 比較オブジェクト

'''

''' 0より小さい値: x が y より小さい

''' 0 : x と y は等しい

''' 0より大きい値: x が y より大きい値

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare

Dim str1 As String = CType(x, String)

Dim str2 As String = CType(y, String)

str1 = str1.Substring(str1.Length - 6, 2)

str2 = str2.Substring(str2.Length - 6, 2)

Dim int1 As Integer

Dim int2 As Integer

If Not Integer.TryParse(str1, int1) Then

'xがキャストできないときはxのほうが大きいとする

Return 1

End If

If Not Integer.TryParse(str2, int2) Then

'yがキャストできないときはyのほうが大きいとする

Return -1

End If

 

Return int1 - int2

End Function

End Class

 

End Class

結果は下記の通りです。

ソート前

c:\test\aa_03.txt

c:\test\dd_11.txt

c:\test\Test_01.txt

c:\test\Test_02.txt

c:\test\Test_10.txt

c:\test\Test_99.txt

c:\test\んん_00.txt

ソート後

c:\test\んん_00.txt

c:\test\Test_01.txt

c:\test\Test_02.txt

c:\test\aa_03.txt

c:\test\Test_10.txt

c:\test\dd_11.txt

c:\test\Test_99.txt

ちゃんと指定された条件で、ソートされてますね。

参考:

@IT:配列を独自の順序でソート(並べ替え)するには?

MSDN:IComparer.Compare メソッド