7.列内包
7.1 forを用いた列の繰り返し
JavaFX台本型プログラミング言語は、for演算子を用いた列内包を支援する。列内包は、1つ以上の入力列、任意選択としてのろ過器、および式から構成される。各入力列は、変数と関連している。列内包の結果は、元となる列の要素の内でろ過器の条件を満たすものの組合せに、式を適用したものからなる新たな列である。
次のプログラムはこの構文の実例を示したもので、曲集の一覧から曲の一部が表題となっているものを特定するためにfor演算子を用いている。
class Album {
attribute title: String;
attribute artist: String;
attribute tracks: String[];
}
var albums =
[Album {
title: "A Hard Day's Night"
artist: "The Beatles"
tracks:
["A Hard Day's Night",
"I Should Have Known Better",
"If I Fell",
"I'm Happy Just To Dance With You",
"And I Love Her",
"Tell Me Why",
"Can't Buy Me Love",
"Any Time At All",
"I'll Cry Instead",
"Things We Said Today",
"When I Get Home",
"You Can't Do That"]
},
Album {
title: "Circle Of Love"
artist: "Steve Miller Band"
tracks:
["Heart Like A Wheel",
"Get On Home",
"Baby Wanna Dance",
"Circle Of Love",
"Macho City"]
}];
for (album in albums, track in album.tracks) {
if (album.title == track)
java.lang.System.out.println("TITLE TRACK = {track}")
else
java.lang.System.out.println("Track = {track}")
}
出力:
TITLE TRACK = A Hard Day's Night
Track = I Should Have Known Better
Track = If I Fell
Track = I'm Happy Just To Dance With You
Track = And I Love Her
Track = Tell Me Why
Track = Can't Buy Me Love
Track = Any Time At All
Track = I'll Cry Instead
Track = Things We Said Today
Track = When I Get Home
Track = You Can't Do That
Track = Heart Like A Wheel
Track = Get On Home
Track = Baby Wanna Dance
TITLE TRACK = Circle Of Love
Track = Macho City
次に示すのは、ろ過器を用いた別の例である。これは、数を受け取ってその因数の一覧を返す関数を定義したものである。
function factors(n:Number) {
return for (i in [1 .. n/2] where n % i == 0) i;
}
訳注:この例では、:Number型の「因数」の列を戻すので、正確には「因数」とは呼べないが…。
forに対する内包の中で、indexof演算子を使用することができる。その構文は「indexof 名称」で、名称は繰り返し変数の名前である。その値は、基となる列における繰り返しの索引の値である。
次の例に示したように、indexof演算子は列の抽出に使用することもできる。
var nums = [1..5];
var numsExceptTheFirstTwo = nums[n|indexof n > 1]; // [ 3, 4, 5 ]を返す
7.2 列変数の変更
insertは、列に新たな要素を挿入する。
insert x into seq
insert x before seq[idx]
insert x after seq[idx]
deleteは、列から要素を取り除く。
delete seq
delete x from seq
delete seq[idx]
delete seq[a..b]
次のコードは、それぞれの例である。
// 挿入の例
var nums = [1..5];
var x = 6;
insert x into nums; // 結果は、[ 1, 2, 3, 4, 5, 6 ]
x++;
insert x before nums[0]; // 結果は、[ 7, 1, 2, 3, 4, 5, 6 ]
x++;
insert x after nums[3]; // 結果は、[ 7, 1, 2, 3, 8, 4, 5, 6 ]
// 削除の例
nums = [1..5];
delete 2 from nums; // 結果は、[ 1, 3, 4, 5 ]
delete nums[0];// 結果は、[ 3, 4, 5 ]
nums = [1..10]; // 結果は、[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
delete nums[3..7]; // 結果は、[ 1, 2, 3, 9, 10 ]
delete nums; // 結果は、[ ]
nums = [1..10];
delete nums[5..]; // 結果は、[ 1, 2, 3, 4, 5 ]
delete nums[0..<]; // 結果は、[ 5 ]
訳注:原文では、最後の「delete nums[0..<];」文が「delete nums[0..>];」と誤記されている。
列の要素を逆順に並べ替えることもできる。
var nums = [1..5];
reverse nums; // [ 5, 4, 3, 2, 1 ]を返す
訳注:2008年6月15日時点のNetBeans 6.1用JavaFX追加接続(Plugin)プログラムで動作確認したところ、「reverse nums;」だけでは、元のnums の要素の並びは変わらなかった(並び替えた結果を利用するためには、「nums = reverse nums;」のように列変数に代入しなおす必要がある。その意味では、delete演算子とは用法が異なる)。
0 件のコメント:
コメントを投稿