リスト項目の追加・削除

リストに項目を結合

 普通、リストに新たな項目を加える場合、以下のように&結合演算子を使います(最後のtheListは結果ウィンドウに値を表示させるためのもの)

set theList to {1, 2}
set theList to theList & 3
theList

 AppleScriptには他に、高速なリストへの項目の追加方法が用意されていて、それは以下のように書きます。

set theList to {1, 2}
set end of theList to 3
theList

 何故こちらが速いかと言えば、推測ですが、前者は「新たに結合後のリストを生成したあとに変数に代入している」が、後者は「既にあるリストの後ろに項目を追加しているだけ」なのでは無かろうかと思います。
 また、リストの先頭に追加する方法も用意されていて、以下のように書きます。

set theList to {1, 2}
set beginning of theList to 0
theList

リストから項目を削除

 今度は逆にリストの前後の項目を削除する方法を考えます。
「delete item 1 of theList」と書ければ楽なんですが、残念ながら、そのようなことはできません。
 さて、リストの先頭を削除するということは、先頭を除く全てを取り出すと言うことなので、以下のように書けます。

set theList to {1, 2, 3, 4}
set theList to items 2 thru -1 of theList

 これでも、特に問題は無いのですが、リストの先頭を除く残りを取り出すのにリストの属性のrest(残り)を使えば、少しばかり分かりやすく書けて高速に処理してくれます。

set theList to {1, 2, 3, 4}
set theList to rest of theList

 リストの最後を除く全ての項目を取り出す方法は特に用意されていませんので、最初の方法と同様に、以下のように書きます。

set theList to {1, 2, 3, 4}
set theList to items 1 thru -2 of theList

 ただし、項目の並びをひっくり返したリストを得る属性のreverse(逆)があるので、それとrestを組み合わせれば、実際の処理では問題ありません。

set theList to {1, 2, 3, 4}
set theList to reverse of theList
set theList to rest of theList
reverse of theList

 これらの処理で注意するのは、空リスト({})に対して使うとエラーとなると言うことです。
 そこで、実際の処理では、repeatにリストが空になったらという条件をつけておく等の対処をします。

set theList to {1, 2, 3, 4}
repeat until theList = {}
	display dialog theList as string
	set theList to rest of theList
end repeat

リストから任意の項目を削除

 リストの先頭や最後尾の項目の処理に比べて、任意位置の項目を処理するのは、なかなか面倒です。
 まず、項目の前後でリストを分割して、再結合する方法が考えられます。

delItem of {1, 2, 3, 4} at 3

on delItem of theList at n
	if n <= 1 then
		return (rest of theList)
	else if n >= number of theList then
		return (items 1 thru -2 of theList)
	else
		return (items 1 thru (n - 1) of theList) & (items (n + 1) thru -1 of theList)
	end if
end delItem

 あまりスマートではありませんので、他の方法も考えてみます。
 リストの全ての項目が同じクラスであることがわかっているならば、削除したい項目を別のクラスの値に変え、全要素参照で元のクラスだけを取り出すという方法が考えられます。

delItem of {1, 2, 3, 4} at 3

on delItem of theList at n
	set item n of theList to ""
	return numbers of theList
end delItem

リストの任意の位置に項目を追加

 削除するのはとにかく、追加する場合は、全く裏技的な方法は思い浮かびませんでした。
 真っ当に、分割して間に項目を加えてます。リストを加えることもできます。
 リストをそのまま項目の一つにしたい場合は、ofの後の引数に{{1, 2, 3}}のように二重にカッコをつけます。

addItem of 0 on {1, 2, 3, 4} at 3

on addItem of addList on theList at n
	if n <= 0 then
		return addList & theList
	else if n >= number of theList then
		return theList & addList
	else
		return (items 1 thru n of theList) &addList& (items (n + 1) thru -1 of theList)
	end if
end addItem

特殊なリスト形式linked list

 AppleScriptには通常のリストの他にlinked listと呼ばれる形式の値が用意されています。
 結合を繰り返すスクリプトを書く場合に、どうしてももう少しスピードを稼ぎたいと言う時は、カッコを{}から[]に変えてみるのも手かもしれません。
 詳しくは「{}と[]の違い」を参照して下さい。


2000-03-02 2000-05-29