POINT
C# の配列はひとつのクラスのため Instance を生成する時は new をする。
System.Array クラスから継承される。
次元は N 次元可能で, 宣言. 初期化の構文以外は C, C++ と同じ.
配列は、[ 同じデータ型の多数のデータを集めたもの ]で、個々のデータはインデックス番号で読み書きできる。
__LINK__( ArrayList )
要素数が 可変の場合は ArrayList をつかう。
WARNING
[] は読み書きに使うときには変数名の後に付くが、宣言時には変数名の手前になる。
int []a = new int[10];
// int 型要素が 10 個はいる配列インスタンスを a という名前で作成
int[] a = new int[10];
// data を代入して初期化
// { 1, 2... } 初期化子リスト
int[] a = new int[10]{1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
int [] a = { 4, 1, 3, 2, 0 };
// 昇順に Sort
System.Array.Sort( a );
// 要素のインデックスを検索する( なければ -1 )
Array.IndexOf( a, 1 );
// 各要素へは , 区切りで指定する
a[0,0] = 1;
// 3次元以上も同じ
int [,,] ar = new int[3,3,3];
Console.Write( ar[0,0,0] );
// 各要素をイテレートする
// IEnumerableというインターフェイスの実装を含む。
foreach( int i in a ) {
}
// 参照型の配列の初期化
Class1 [] ar = new Class1 [] { new Class1(1), new Class1(2), new Class1(3) };
2次元配列
int[,] a = new int[3,2];
int[,] a = new int[3,2]{ {1,1}, {1,1}, {1,1} };
画像データ
byte[,] image = new byte[128,128];
参照型の配列
POINT
参照型の配列の場合は, 配列自体の Instance の作成だけでなく,
要素を new した インスタンスをセットする必要がある。
各要素は参照型のため値は null となっている。
利用するには各要素ごとにさらにインスタンスをつくり、その値をセットしておく必要がある。
要素の数が10個なら、配列自身と要素を合わせて、11回のnewをする。
{
// インスタンスを作成。
string [] ar = new string[10];
for( int i=0; i<10; i++ )
{
// 実行時に null を参照したというエラーになる
//Console.WriteLine( ar[i].Length );
}
for( int i=0; i<10; i++ )
{
ar[i] = (i*2).ToString();
}
for( int i=0; i<10; i++ )
{
Console.WriteLine( ar[i].Length );
}
}
{
// Sort の条件は IComparable を実装することで実現できる.
class Item : IComparable
{
public string name;
public int price;
public Item( string name, int price )
{
this.name = name;
this.price = price;
}
// 比較する必要な Interface
// ここでは値段で比較.
public int CompareTo( object obj )
{
return price - ((Item)obj).price;
}
}
class Test
{
static void Main(string[] args)
{
Item [] ar = {
new Item("チョコ",50),
new Item("煎餅",200),
new Item("飴",10),
new Item("ポテチ",100)
};
// Itemクラスのインスタンスをソートする
Array.Sort( ar );
foreach( Item it in ar )
{
Console.WriteLine("{0},{1}",it.name,it.price);
}
}
}
バイナリ・サーチ
POINT
System.Array クラスには
ソートだけでなくバイナリ・サーチも利用できる。
{
int [] ar = { 4,9,3,6,1,0 };
Array.Sort( ar );
foreach( int n in ar )
{
Console.WriteLine( n );
}
// Array.BinarySearch() で検索可能
int index = Array.BinarySearch( ar, 3 );
Console.WriteLine( "index of 3 is {0}", index );
}
値が“3”である要素のインデックスが“2”であることが分かる。
POINT
Array.BinarySearch() を利用することで, BinarySearch を利用できる。
ただしソートすみである必要がある.
POINT
配列型はれっきとしたデータ型なので、メソッドの引数に使ったり、
メソッドの戻り値として使ったりできる。
配列型は要素数を限定しないため、大きさの決まっていない配列を受け渡すことができる。
{
class Class1
{
static public int [] makeArray( bool select )
{
if( select )
{
int [] ar = { 0,1,2,3 };
return ar;
}
else
{
int [] ar = { 0,1 };
// 配列型をかえす.
return ar;
}
}
// 配列型をうけとる.
// 要素が何個の配列でも受け取ることができる。
static public void dumpArray( int [] ar )
{
foreach( int n in ar )
{
Console.WriteLine( n );
}
}
static void Main(string[] args)
{
int [] ar = makeArray(false);
dumpArray( ar );
Console.WriteLine();
// 配列変数( 参照 )を再度代入することも可能.
// 29 の 配列 Instance は参照がなくなるので, 消えることになる.
ar = makeArray(true);
dumpArray( ar );
}
}
}
要素数に関係なく、配列を受け渡しできる。
POINT
配列変数への代入は, 配列 Instance を再利用しないで, 新規に作成される.
各要素の表示にforeach文を使用すれば、要素の個数を調べる必要はない。
int []が指定されていることから分かるとおり、
このメソッドは、整数の配列を返す。
要素数に関係なく、戻値として渡すことができる。
WARNING
配列変数への代入は、配列の再利用にはならず、
別個の配列インスタンスが生成される。
参照型配列の初期化
POINT
参照型の配列も初期化できる
{
class Class1
{
private int n;
public Class1( int param )
{
this.n = param;
}
static void Main(string[] args)
{
for( int i=0; i<3; i++ )
{
Console.WriteLine( ar[i].n );
}
}
}
}