JavaFX Scriptプログラム言語を学ぼう

レッスン5:配列

基本的なデータの型に加えて、JavaFX Scriptプログラム言語はsequence(注釈:以降では配列) と呼ばれる特別なデータ構造を提供します。 配列は正しく並べられたオブジェクトのリストを表します。 (ですが、配列事態はオブジェクトではありません。) 配列の中のオブジェクトはitem(注釈:以降では要素)と呼ばれます。 配列は角括弧"[]"で宣言され、各要素はカンマで区切られています。 このレッスンは配列の生成と使い方の基礎のすべてを取り上げます。 配列のスライス(配列の一部分)の使い方も考察します。 さらなる情報は、 JavaFX言語リファレンス配列型 をご覧ください。

配列の作成


配列を作成するひとつの方法は明示的にその要素を列挙することです。 各々の要素はカンマで区切ってリストは大括弧の""で囲みます。 例えば次のコードは、

def weekDays = ["Mon","Tue","Wed","Thu","Fri"];

配列を宣言してそれをweekDaysに割り当てます。私達はこの例でdefを使います。 それは私達がその値を配列が生成された後に変更する予定がないからです。 ここでコンパイラは私達が"文字列の配列"を作ろうとしていることを知っていて、 それは個々のアイテムがすべてStringのリテラルで宣言されているからです。 もし、配列がIntegerで宣言されていたら(例えばdef nums = 1,2,3;)、 コンパイラは私達が"整数の配列"を欲しがっていることを知ります。

あなたは明示的に配列の型を指定することもできます。 それは"[]"を後ろに付けた型の名前を、その宣言に含めるように変更することでできます。

def weekDays: String[] = ["Mon","Tue","Wed","Thu","Fri"];

これはweekDaysがStringの配列を(単一のStringではなくて)保持することをコンパイラにに伝えています。

配列は他の配列の中で宣言することもできます。

def days = [weekDays, ["Sat","Sun"]];

このようなケースでは、コンパイラは自動的に、階層化された配列を水平化してひとつの配列に形成します。 上を次と同じにします。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

簡易的な表記法もあり、もっと簡単に数値が連続する形式の配列を作ることができます。 1から100までの数字から成る配列を作るには、次を使います。

def nums = [1..100];

実際の使用例:Display Shelf(配列の例 #1)

(訳注:上の画像は原文が表示している画像そのものです。)

このスクリーンショットはデモアプリケーション"Display SHelf"を表しています。 右側に抜粋されたコードはGroupオブジェクトに属するインスタンス変数contentを表しています。 この変数は配列を保持していて、二つの要素(強調されたImageViewとRectangleオブジェクト) で初期化されています。 それが角括弧(訳注:大括弧とも)で始まって終わっているのを探せれば(強調されてもいますが)、 あなたは配列の存在に気が付けるでしょう。 配列の要素はカンマで区切られていて、それがImageViewとRectangleオブジェクトの間に 現れる","の理由です。

述部の使用


あなたは真偽式(述部とも呼ばれます)を使うことができます。 これは既に存在する配列のサブセットである新しい配列を宣言するものです。 例えば、以下を良く見てください。

def nums = [1,2,3,4,5];

2より大きい数値だけを含む二つ目の配列を(最初の配列に見られる要素を基準にして)作るには、 以下を使います。

def numsGreaterThanTwo = nums[n | n > 2];

あなたは前のコードの行を英語(訳注:訳すので日本語ですが)で このように言い表すことができます。 「すべての要素をnum配列から選択し、その要素の値は2よりも大きく、 要素を新しい配列numsGreaterThanTwoに割り当てます。」 太字で強調した"その要素の値は"の節が述部です。

このコードでは:

  1. 新しく配列を作ってnumsreaterThanTwoに保存します。
  2. (太字で印した)コードnums[n | n > 2!];は、 要素がそこからコピーされる元の配列を指しています。
  3. これはnumsから要素を選択し、その要素から成る新しい配列を返します。 その要素は順序正しく、式がtrueになるときだけです。
  4. "|"文字は視覚的な区切りとして使われていて、変数"n"を残りのコードと分けています。 nums[n '''|''' n > 2!];
  5. (太字で印した)コードnums[n | '''n > 2'''!];は、 現在の要素を新しい配列にコピーする前に、合致させる基準を指定する真偽式を定義しています。

配列要素へのアクセス


配列の要素は数値のインデクスでアクセスされ、それは0で始まります。 個々の要素にアクセスするには、配列の名前を打ち込んで、 その要素の数値のインデクスを角括弧で囲って続けます。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

println(days[0]);
println(days[1]);
println(days[2]);
println(days[3]);
println(days[4]);
println(days[5]);
println(days[6]);

これはコンソールに次を印字します。

Mon
Tue
Wed
Thu
Fri
Sat
Sun

あなたはsizeof演算子を使って配列のサイズを測定することもできます。 演算子には配列の名前が後ろに続きます。

sizeof days

以下のコードはコンソールに"7"を印字します。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
println(sizeof days);

配列への要素の挿入


insertキーワードは配列の中に要素を、指定した要素の前や後ろに挿入することができます。

注意:技術的に言えば、配列は不変です。これは一旦作られたら変更されないことを意味します。 あなたが配列を挿入や削除で変更したとき、例えば、その背後では新しい配列が作られて 配列の変数が再び割り当てられ、配列が変更されたような印象を与えます。

days配列の再生成で、これを調べてみましょう。私達は今days変数をvarで宣言します。 なぜなら私達はその値を、元の配列が作られた後で変更するつもりがないからです。

var days = ["Mon"];

この時点で、配列はひとつだけの要素"Mon"を含んでいます。

私達はinsertとintoキーワードを使って"Tue"をこの配列の最後に挿入できます。

insert "Tue" into days;

同様に、私達は"Fri", "Sat", "Sun"も追加できます。

insert "Fri" into days;
insert "Sat" into days;
insert "Sun" into days;

配列は今"Mon", "Tue", "Fri", "Sat", "Sun"を含んでいます。

私達はinsertとbeforeキーワードを使って、与えたインデクスの要素の前に、要素を挿入することもできます。 インデクスは0から始まることを覚えていてください。 私達の配列は今、"Fri"がインデクスの2の位置にあります。従って私達は次のようにして "Thu"を"Fri"の前に挿入できます。

insert "Thu" before days[2];

配列は今"Mon", "Tue", "Thu", "Fri", "Sat", "Sun"を含んでいます。

"Wed"を"Tue"の後ろに挿入するために、insertとafterキーワードを使うことができます。

insert "wed" after days[1];

配列は今、週のすべての曜日を含んでいて、"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"です。

配列からの要素の削除


deleteとfromキーワードは配列からの要素の削除を簡単にさせてくれます。

delete "Sun" from days;

配列は今、次を含んでいます。"Mon", "Tue", "Wed", "Thu", "Fri", "Sat"

あなたは指定したインデクスの位置から要素を削除することもできます。 次のコードは配列から"Mon"を削除しています。 ("Mon"が最初の要素なので、そのインデクスの位置は0であることを思い出してください。)

delete days[0];

配列から全ての要素を削除するには、deleteキーワードを、配列の名前を後ろに続けて使ってください。

delete days;

deleteは配列から要素を削除するだけであることに注目してください。 それはあなたのスクリプトからdays変数を削除しません。 あなたは今もdays変数にアクセスでき、新しい要素を以前のように追加できます。

配列要素の反転


reverse演算子を使って配列の要素を簡単に反転できます。

var nums = [1..5];
reverse nums; // returns [5, 4, 3, 2, 1]

配列の比較


配列が等価であるか比較したいときがあるかも知れません。 配列はその値で等価かどうか比較されます。 もし、そのレングスが同じで、要素が等価であれば、それらは等価です。

中身がまったく同じ配列を二つ作ってこれをテストしましょう。

def seq1 = [1,2,3,4,5];
def seq2 = [1,2,3,4,5];
println(seq1 == seq2);

式 seq1 == seq2 はtrueと評価されます。なぜなら両方の配列は同じ数の要素を持ち、 各々の要素の値が両方の配列で同じだからです。従ってこのコードは"true"をコンソールに印字します。

一方の配列の要素の数を変えることにより(他方は変えない)、配列は今、異なるレングスになります。

def seq1 = [1,2,3,4,5];
def seq2 = [1,2,3,4,5,6];
println(seq1 == seq2);

ここで、このスクリプトの出力は"false"です。なぜなら、二番目の配列は最初の配列よりも長いからです。 従ってそれらを不等価にします。

私達は要素の値を変更することで、二つの配列を不等価にすることもできます。 配列がまだ同じ長さであってもです。

def seq1 = [1,2,3,4,5];
def seq2 = [1,3,2,4,5];
println(seq1 == seq2);

再度このコードは"false"を印字するでしょう。なぜなら二つの配列は等価でないからです。

スライスの使用


配列のスライスは、配列の一部分へのアクセスを提供します。

seq[a..b]

この構文はインデクスaとbの間の要素へのアクセスを提供します。両端を含みます。 次のスクリプトは"Sat"と"Sun"の要素だけから成るweekend配列を作ります。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def weekend = days[5..6];

seq[a..<b]

インデクスa(含む)とb(含まない)の間の要素にアクセスするには"<"文字を使ってください。 私達はこれをdaysに使って"Mon"から"Fri"までの要素から成るweekdays配列を作ることができます。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def weekdays = days[0..<5];

seq[a..]

二番目のインデクスを省略することによって、あなたはインデクスaから配列の最後までの全ての要素に アクセスできます。同じ例のままで、私達はweekend配列を次のようにして作ることができます。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def weekend = days[5..];

seq[a..<]

最後に、インデクスaから配列の最後までの全てにアクセスするために、二番目のインデクス無しに "<"を使うことができます。ただし、最後の要素は含みません。

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
def days2 = days[0..<];

このバージョンは"Mon"から"Sat"までの要素からなるdays2配列を作ります。

実際の使用例:Display Shelf(配列の例 #2)

(訳注:上の画像は原文が表示している画像そのものです。)

このコードは二つのスライスの使い方を示すデモアプリケーションの"Display Shelf"からリストしています。 このスライスは"0..half-2"と"half..content.size()-1"の範囲で個々に宣言されています。 スライスを確認するには、角括弧の内側の".."を見てください。


Home