配列をソートする
System.Arrayクラスには、Sortという名のstaticなメソッドがある。これは、その名のとおり、配列をソートする機能を持ったものである。実際にそれを使った例を以下に示す。
1: using System;
2:
3: namespace ConsoleApplication78
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: int [] ar = { 4, 1, 3, 2, 0 };
10: Array.Sort( ar );
11: foreach( int n in ar )
12: {
13: Console.WriteLine( n );
14: }
15: }
16: }
17: } |
|
配列のソートを行っているサンプル・プログラム9 |
staticなArray.Sortメソッドにより配列の要素をソートすることができる。 |
これを実行すると以下のようになる。
|
サンプル・プログラム9の実行結果 |
初期値では4、1、3、2、0だった配列の内容が昇順にソートされているのが分かる。
|
見てのとおり、説明を要する個所はほとんどない。ソートといっても、10行目のSortメソッドの呼び出し一発で終わってしまうのである。
ソートの条件をカスタマイズする
整数のようなシンプルなデータであれば、何も考えないでソートさせるだけですむ。しかし、より複雑な情報を配列変数で扱った場合、いろいろな解釈が可能であるため、そう簡単にソートを実現することはできない。そこで、ソートの条件をプログラマが指定する方法を説明する。以下が実際にそれを行ったサンプルソースである。
1: using System;
2:
3: namespace ConsoleApplication79
4: {
5: class Item : IComparable
6: {
7: public string name;
8: public int price;
9: public Item( string name, int price )
10: {
11: this.name = name;
12: this.price = price;
13: }
14: public int CompareTo( object obj )
15: {
16: return price - ((Item)obj).price;
17: }
18: }
19: class Class1
20: {
21: static void Main(string[] args)
22: {
23: Item [] ar = {
24: new Item("チョコ",50),
25: new Item("煎餅",200),
26: new Item("飴",10),
27: new Item("ポテチ",100)
28: };
29: Array.Sort( ar );
30: foreach( Item it in ar )
31: {
32: Console.WriteLine("{0},{1}",it.name,it.price);
33: }
34: }
35: }
36: } |
|
ソートの条件を指定しているサンプル・プログラム10 |
ソートのための比較に使用されるCompareToメソッドを実装する必要がある。 |
これを実行すると以下のようになる。
|
サンプル・プログラム10の実行結果 |
各要素が価格によってソートされたのがわかる。
|
このサンプルソースは、Itemクラスの配列をソートする。Itemクラスには名前(name)と価格(price)の2つの情報があり、どちらをソートのキーと見るかによってソート結果が変わってしまう。ここでは、価格でソートしたいとする。ソートが行われる際には、IComparableというインターフェイスを通じて、CompareToというメソッドが呼ばれる。CompareToメソッドの結果をコントロールすることにより、思いどおりの順序でソートさせることが可能になるのである。
CompareToメソッドは、インスタンス自身と引数のインスタンスを比較して、その結果として、整数型の値を返す。返す値の内容は、引数インスタンスよりも小さいときは、負の値、同じなら0、大きければ正の値を返す。16行目では、まさにその値を返すための計算を行っている。要するに、価格を引き算してやれば、指定された条件を満たす結果を返すことができるわけである。
Insider.NET 記事ランキング
本日
月間