配列は .NET Framework における System.Array 型から派生した複数の変数を含む参照型です。
配列の要素をソートするには Array.Sort メソッドを使います。
Sort メソッドのオーバーロードは8つ存在しますが以下の例ではその中の
Public Shared Sub Sort(ByVal array As System.Array, ByVal comparer As System.Collections.IComparer)
を使用します。
① String 型配列のソート
IComparer には、System.Collections.Comparer クラスを使いました。
このコンストラクタに用いる System.Globalization.CultureInfo には CurrentCulture ( ja-JP ) を指定しました。
Sub Main()
Dim fruits As String() = _
{"キウィ", "オレンジ", "バナナ", "りんご", "いちご", "もも", "ぶどう", "パイナップル", "あんず"}
Console.WriteLine("カルチャ:{0}", System.Globalization.CultureInfo.CurrentCulture.ToString())
Console.WriteLine()
Console.WriteLine("ソート前")
ShowArray(fruits)
Console.WriteLine("辞書順にソート")
Array.Sort(fruits, New Comparer(System.Globalization.CultureInfo.CurrentCulture))
ShowArray(fruits)
Console.WriteLine("辞書順の逆順にソート")
Array.Sort(fruits, New Comparer(System.Globalization.CultureInfo.CurrentCulture))
Array.Reverse(fruits)
ShowArray(fruits)
End Sub
Overloads Sub ShowArray(ByVal array As String())
For i As Integer = 0 To array.Length - 1
Console.WriteLine("Array({0}) : {1}", i, array(i))
Next i
Console.WriteLine()
End Sub
このコードを実行すると、以下のような出力結果が得られます。
カルチャ:ja-JP
ソート前
Array(0) : キウィ
Array(1) : オレンジ
Array(2) : バナナ
Array(3) : りんご
Array(4) : いちご
Array(5) : もも
Array(6) : ぶどう
Array(7) : パイナップル
Array(8) : あんず
辞書順にソート
Array(0) : あんず
Array(1) : いちご
Array(2) : オレンジ
Array(3) : キウィ
Array(4) : パイナップル
Array(5) : バナナ
Array(6) : ぶどう
Array(7) : もも
Array(8) : りんご
辞書順の逆順にソート
Array(0) : りんご
Array(1) : もも
Array(2) : ぶどう
Array(3) : バナナ
Array(4) : パイナップル
Array(5) : キウィ
Array(6) : オレンジ
Array(7) : いちご
Array(8) : あんず
① Integer 型配列のソート
IComparer には、以下に示す偶数と奇数のどちらかを優先的に比較するカスタム演算子を使います。
このクラスは System.Collection.IComparer を実装しています。
Public Class myNumberComparer
Implements System.Collections.IComparer
Private m_CompareOrder As NumberCompareOrder
Public Sub New(ByVal nco As NumberCompareOrder)
m_CompareOrder = nco
End Sub
Public Property CompareOrder() As NumberCompareOrder
Get
Return m_CompareOrder
End Get
Set(ByVal Value As NumberCompareOrder)
m_CompareOrder = Value
End Set
End Property
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare
If DirectCast(x, Integer) Mod 2 = 0 _
AndAlso System.Math.Abs(DirectCast(y, Integer) Mod 2) = 1 Then
Return -1 * m_CompareOrder
ElseIf System.Math.Abs(DirectCast(x, Integer) Mod 2) = 1 _
AndAlso DirectCast(y, Integer) Mod 2 = 0 Then
Return 1 * m_CompareOrder
Else
Return DirectCast(x, Integer).CompareTo(DirectCast(y, Integer))
End If
End Function
End Class
Public Enum NumberCompareOrder
EvenFirst = -1
OddFirst = 1
End Enum
このクラスを使って以下のようなソートを行ってみます。
Sub Main()
Dim numbers As Integer() = {-2, 6, 3, 8, 0, 4, -1, 7, 3, 2}
Console.WriteLine("ソート前")
ShowArray(numbers)
Console.WriteLine("普通にソート")
Array.Sort(numbers)
ShowArray(numbers)
Console.WriteLine("偶数優先でソート")
Array.Sort(numbers, New myNumberComparer(NumberCompareOrder.EvenFirst))
ShowArray(numbers)
Console.WriteLine("奇数優先でソート")
Array.Sort(numbers, New myNumberComparer(NumberCompareOrder.OddFirst))
ShowArray(numbers)
End Sub
Overloads Sub ShowArray(ByVal array As Integer())
For i As Integer = 0 To array.Length - 1
Console.WriteLine("Array({0}) : {1,2}", i, array(i).ToString())
Next i
Console.WriteLine()
End Sub
このコードを実行すると、以下のような出力結果が得られます。
ソート前
Array(0) : -2
Array(1) : 6
Array(2) : 3
Array(3) : 8
Array(4) : 0
Array(5) : 4
Array(6) : -1
Array(7) : 7
Array(8) : 3
Array(9) : 2
普通にソート
Array(0) : -2
Array(1) : -1
Array(2) : 0
Array(3) : 2
Array(4) : 3
Array(5) : 3
Array(6) : 4
Array(7) : 6
Array(8) : 7
Array(9) : 8
偶数優先でソート
Array(0) : -1
Array(1) : 3
Array(2) : 3
Array(3) : 7
Array(4) : -2
Array(5) : 0
Array(6) : 2
Array(7) : 4
Array(8) : 6
Array(9) : 8
奇数優先でソート
Array(0) : -2
Array(1) : 0
Array(2) : 2
Array(3) : 4
Array(4) : 6
Array(5) : 8
Array(6) : -1
Array(7) : 3
Array(8) : 3
Array(9) : 7