JScript.NETには
Arrayオブジェクト
に
配列があって、
さらにSystem.
Arrayクラスというのが用意されています。
Arrayクラスは次のように使います。
import System;
//3次元配列を作成
var a : System.Array = System.Array.CreateInstance(System.Int32, 3, 4, 5);
for(var i = 0; i < 3; i++)
for(var j = 0; j < 4; j++)
for(var k = 0; k < 5; k++)
a.SetValue(i + j + k, i, j, k);
print(a.GetValue(1, 1, 1));
CreateInstanceメソッドでオブジェクトを作成し、
SetValue、
GetValueで
値の設定、取得を行います。
この先メンバを紹介していきますが、
全てのメンバを紹介するのは無理なので、
Array メンバを参照してください。
まず、2つのプロパティを紹介します。
import System;
var a : System.Array = System.Array.CreateInstance(System.Int32, 3, 4, 5);
print(a.Length); //60(=3*4*5)
print(a.Rank); //3
var b : int[][] = new (int [])[5];
print(b.Length); //5
print(b.Rank); //1
Lengthプロパティは配列の全ての要素の数を表します。
ReadOnlyです。
最初の例は3次元配列ですべての次元を合わせて60です。
Rankプロパティは配列の次元を表します。
ReadOnlyです。
この場合、もちろん3です。
その下の例は、配列の配列であることに注意しましょう。
これらのプロパティと次のメソッドは実は配列にも適用できます。
Lengthプロパティで全ての要素の数を得ることができましたが、
多次元配列では個々の次元の大きさを得ることはできませんでした。
GetLengthメソッドは
指定した次元の要素の数を得ることができます。
また、
GetLowerBoundメソッドと
GetUpperBoundメソッドは、
それぞれ指定した次元の下限と上限を得ることができます。
var a : int[,,] = new int[3,4,5];
print(a.GetLength(2)); //5
print(a.GetLowerBound(2)); //0
print(a.GetUpperBound(2)); //4
それぞれのメソッドの引数は0から始まる次元を表し、
上の例だと3次元目、すなわち一番下の次元を表します。
IndexOfメソッドを使うと
ある要素がArrayの中の何番目にあるかが分かります。
import System;
var a : System.Array = System.Array.CreateInstance(System.Int32, 17);
//Arrayオブジェクトを代入することもできるらしい
a = [ 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 ];
print(System.Array.IndexOf(a, 17)); //4
print(System.Array.IndexOf(a, 15)); //-1(見つからなかった)
ただし、単に前から探しているだけだと思われます。
ソートしてからだと二分木探索が使えます。
binsearch.js
---------------------------------------------------------------------------
import System;
import System.Collections;
var a : System.Array = System.Array.CreateInstance(vegetable, 4);
a.SetValue(new vegetable("キャベツ", 130), 0);
a.SetValue(new vegetable("もやし", 38), 1);
a.SetValue(new vegetable("ニラ", 80), 2);
a.SetValue(new vegetable("ホウレン草", 200), 3);
System.Array.Sort(a, new LessString()); //名前順にソート
//名前順に表示
for(var i : int = 0; i < 4; i++)
print(a.GetValue(i).name);
//キャベツを探す
var index : int = System.Array.BinarySearch(a, "キャベツ", new LessString());
print(a.GetValue(index).price); //キャベツの値段を表示
//野菜クラス
class vegetable {
var name : String;
var price : int;
function vegetable(name : String, price : int) {
this.name = name;
this.price = price;
};
function ToString() : String { return this.name; };
}
//これを使わない方法はないのだろうか
class LessString implements IComparer {
function Compare(a : Object, b : Object) : int {
return System.String.Compare(a.ToString(), b.ToString());
};
}
Sortメソッドは
ArrayListと同じです。
こうしてソートしておくと
BinarySearchメソッドが使えます。
返り値はIndexOfと同じです。
しかし、配列のサイズをnとすると、log nのオーダーで検索でき、
処理が速くなるはずです(この例ではn=4なので意味がありませんが)。
適切にソートされていないときは、BinarySearchの結果がどうなるかわかりません。