Tips - Visual Basic

【TOP】

配列をソートする
配列は .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 ' 配列の内容を表示(String()用) 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 ' IComparer.Compareメソッドの実装 Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _ Implements System.Collections.IComparer.Compare ' x:偶数、y:奇数 If DirectCast(x, Integer) Mod 2 = 0 _ AndAlso System.Math.Abs(DirectCast(y, Integer) Mod 2) = 1 Then Return -1 * m_CompareOrder ' x:奇数、y:偶数 ElseIf System.Math.Abs(DirectCast(x, Integer) Mod 2) = 1 _ AndAlso DirectCast(y, Integer) Mod 2 = 0 Then Return 1 * m_CompareOrder ' (x:偶数、y:偶数) または (x:奇数、y:奇数) 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 ' 配列の内容を表示(Integer()用) 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
【戻る】