.NET TIPS 自作クラスによる配列をソート(並べ替え)するには?デジタルアドバンテージ2004/10/15 |
|
|
「TIPS:配列を独自の順序でソート(並べ替え)するには?」では、IComparerインターフェイス(System.Collections名前空間)を実装したクラスを用意することで、文字列配列のソートを行った。この方法では、任意のクラスのオブジェクトからなる配列も、独自の順序でソートすることができる。
例えば、次のようなWordクラスがあるとしよう(C#の場合。VB.NETについては以下のサンプル・プログラムを参照)。
public class Word {
public string data;
public Word(string s) { data = s; }
}
このクラスの配列を、そのメンバである文字列「data」の長さによりソートするには、「TIPS:配列を独自の順序でソート(並べ替え)するには?」で解説している方法により、次のようにして行うことができる。
|
|
IComparerインターフェイスを実装したクラスによりWordクラスの配列をソートするC#のサンプル・プログラム(wordsort1.cs) | |
|
|
IComparerインターフェイスを実装したクラスによりWordクラスの配列をソートするVB.NETのサンプル・プログラム(wordsort1.vb) | |
自作クラスのオブジェクトからなる配列をソートするには、このようなIComparerインターフェイスを用いた方法に加え、IComparableインターフェイス(System名前空間)を用いた方法でも可能だ。次にこれについて解説する。
IComparableインターフェイスのCompareToメソッド
「TIPS:配列を独自の順序でソート(並べ替え)するには?」の最後で解説しているように、パラメータとして配列のみを指定するArray.Sortメソッドは、最終的には指定された配列の要素に対してCompareToメソッドを呼び出すことにより、2つの要素の大小を比較して並べ替えを行う。このCompareToメソッドを定義しているのがIComparableインターフェイスである。
IComparableインターフェイスのCompareToメソッドのシグネチャは次のようになっている(以下はC#による定義)。
int CompareTo(object obj)
「Array.Sort(配列)」の実行は、配列内のある要素に対して、このCompareToメソッドを呼び出す。このとき、比較対象となる配列内の別の要素がパラメータとして渡される。CompareToメソッドは、IComparerインターフェイスのCompareメソッドと同様に、比較結果により負の値、0、正の値のいずれかを戻り値として返さなければならない。
つまり、自作クラスにIComparableインターフェイスを実装し、CompareToメソッドを定義しておけば、そのクラスのオブジェクトの配列は「Array.Sort(配列)」の呼び出しによりソートできるというわけである。前掲のTIPSでも述べているように、ほとんどの数値型や文字列型(Stringクラス)は、このIComparableインターフェイスを実装している。
IComparableインターフェイスを実装したソート可能なクラス
冒頭で示したWordクラスにIComparableインターフェイスを実装し、そのメンバである文字列「data」の長さにより、その配列をソートするサンプル・プログラムを次に示す。
|
|
IComparableインターフェイスを実装したWordクラスの配列をソートするC#のサンプル・プログラム(wordsort2.cs) | |
|
|
IComparableインターフェイスを実装したWordクラスの配列をソートするVB.NETのサンプル・プログラム(wordsort2.vb) | |
このプログラムで示しているように、CompareToメソッドでは、そのインスタンス自身(C#では「this」、VB.NETでは「Me」により参照可能)とパラメータで渡された別のインスタンスとの比較を行うことになる。
なお、ここではArrayクラスのSortメソッドについて取り上げたが、可変長の配列として利用できるArrayListクラス(System.Collections名前空間)のSortメソッドも、各要素のIComparableインターフェイス実装を利用してソートを行う(実際には、その内部でArray.Sortメソッドを使ってソートを行っている)。
カテゴリ:クラス・ライブラリ 処理対象:配列 使用ライブラリ:Arrayクラス(System名前空間) 使用ライブラリ:IComparerインターフェイス(System.Collections名前空間) 使用ライブラリ:IComparableインターフェイス(System名前空間) 使用ライブラリ:ArrayListクラス(System.Collections名前空間) 関連TIPS:配列を独自の順序でソート(並べ替え)するには? |
|
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|