[Groovy][QuPath] 章6 Groovy言語入門
※ 画像解析ソフトQuPathに関する本を執筆中。完成した章から公開していく。
ここでは本書で使用するGroovy言語の基本的なコマンドを紹介する。各項ではGroovy言語自体の説明は避けるので、わからないことがあればこの章に立ち返って確認してほしい。
目次
基本的にはJavaと同様の書き方だが、改行を示す;
はあってもなくても良い。
コメントアウトはJavaと同様で\\
を使用。複数行にまたがる場合は以下のようにする。
\*
文
文
文
*\
基本の演算処理
他プログラミング言語と同様である。
1 + 2
3
2 - 3
-1
3 * 4
12
4 / 5
0.8
2**10
1024
5%2
1
条件式
- equal: ==
- not equal: !=
- and: &か&&
- or: |か||
- 比較: >, >=, <, <=
変数/object
変数名 = 値
でその値を変数として保存できる。
変数を使った演算も他プログラミング言語と同様。
a = 1
b = 2
a + b
3
型宣言
GroovyではJavaのように変数の型に応じた型宣言をしなくとも次のようにdefキーワードを使って変数を宣言することが可能。
def 変数名 = 入れる値や文字
それどころか、defキーワードを使わずとも、変数の作成が可能である。
ただプログラミング言語の一般論では変数の型を宣言した方が処理が早くなる。実際に以下のように型宣言の有り無しを比較してみると、明確な型宣言をした方が処理は早いようである。
型宣言無し
def
floatであることを宣言
繰り返しの多い処理でなければ速度の違いを実感することは無いだろうが、本書でもなるべく明確な型宣言を採用することにする。もし自作でスクリプトを書くときに型が分からなければdefにしておけば良い。
変数の型としては以下が本書では登場する。
- String: 文字列
- int: 整数
- float: 32ビット単精度浮動小数点数
- boolean: trueかfalse
- List: 集合
ただし、注意点として一度宣言した変数は、上書きができなくなる。同じ変数を処理の中でパラメーターを変えて使うような場合はひっかかる。
以下のように変数宣言が1度だけだとエラーが出ない。
a = 1
def a = 2
def a = 1
a = 2
リスト
リストは[]で作成。異なる変数の型があってもよい。リストに変数を入れることも可能。
自由度高くなんでも保持させられる。リストを使った演算も簡単。
List a = [1,2,3]
List b = ["a","b","c"]
List c = [1,2,"c"]
a = 1
b = "test"
[1,2,a,b]
[1, 2, 1, test]
List a = ["a","b","c"]
[1,2,a]
[1, 2, [a, b, c]]
a = 1..10
a[0]
1
リストを連結するにはリスト同士を足し算するだけ。
List a = ["a","b","c"]
List b = ["c", "d", "e"]
a + b
[a, b, c, c, d, e]
リストの差分を得るにはリストを引き算するだけ。
List a = ["a","b","c"]
List b = ["c", "d", "e"]
a - b
[a, b]
リストの掛け算ではリストが反復される。
a = ["a","b","c"]
a*2
[a, b, c, a, b, c]
リスト同士の掛け算は無い。
index
list[index]
のように指定する。
リストから要素を取り出す場合は、要素番号をList a = [1,2,3,4,5]
a[1]
2
Groovyではindexは0から始まる。リストの最初の要素を取り出す場合は、list[0]
となる。
複数要素を取り出す場合は[]内にコンマ区切りで要素番号を入れるだけである。
List a = [1,2,3,4,5]
a[0,4]
[1, 5]
※ リストから複数要素取り出した場合は、リストのまま取り出される。
リストの後ろから要素を取り出す場合はマイナス記号を使用する。
List a = [1,2,3,4,5]
a[-1]
5
リストに行えるmethod
Java/Groovyは特定の型の変数に用意されたmethodがある。
ネットで検索しても組み込みmethodが確認できるが、describe機能でmethod一覧を表示することもできる。
describe(List)
// List型の変数を使うことも可能
沢山あるのですべては紹介しないが、使用するものを幾つか紹介する。
変数名.method()
のような書き方でその変数の組み込みmethodが実行できる。
要素の数を調べる
List a = 1..1000
a.size()
1000
重複を無くす
List a = [1,1,2,3,"a","a","b","c"]
a.unique()
[1, 2, 3, a, b, c]
loop
Groovyはforやwhileと言った繰り返し処理も使用できるが、リスト内の要素を1つずつ取り出して処理を繰り返すのに簡単なmethodがある。
中でもeach
, eachWithIndex
, collect
, findAll
methodを本書では使用する。
each
リスト.each{処理内容}
が基本的な構図である。リストから取り出された要素はitという名前で参照できる。
List a = 1..10
a.each {
print it
}
QuPathのScript Editorでは{}内で改行するとindentが作られるが、indentはあってもなくても良い。
リストから取り出した要素名を自身で設定することもできる。
以下のように{}内の最初に任意の変数名 ->
と一文入れておく。
List numbers = 1..10
numbers.each {num ->
print num
}
eachWithIndex
リストから要素を取り出すと同時に要素番号も一緒に取り出すことができる。
List list = ["a","b","c"]
list.eachWithIndex {it,i ->
print i
print it
}
collect
collectはリストの各要素に処理をして、新たなリストとして返す。
List list = [1,10,100]
List list2 = list.collect {
it - 1
}
print list2
findAll
リストの中から条件に合うものを抽出する。
List list = ["a","a","b","c"]
list.findAll {
it == "a"
}
List list = ["a","a","b","c"]
list.findAll {
it == "a" | it == "b"
}
findメソッドも同様の使い方ができるが、1つ目にヒットしたものしか返さない。本書では登場しない。
for文/while文
for
for(初期化式; 条件式; 変化式){処理内容}
という記法でJavaと同じである。
条件式がtrueのうちは処理内容が繰り返される。
for(int i=0; i<10; i++) {
print i
}
i++
はiに1を足すことを意味しており、i+=1
やi = i+1
と同義である。
ちなみにループ内で宣言して作成した変数はループ外に引き継がれない。
for(int i=0; i<10; i++) {
def a = i
}
print a
変数宣言しなければループの外でも変数が残っている。
for(int i=0; i<10; i++) {
a = i
}
print a
a
while
こちらもJavaと同様である。while(条件式){処理内容}
条件式がtrueのうちは処理内容が繰り返される。
int i = 0
while(i < 10) {
print i
i ++
}
慣れないうちは無限ループに陥って、処理が終わらなくなる。
QuPathを強制終了させないといけなくなる。
continue
特定の条件を満たすときにそのループの処理をskipして次のループへ進む。
for(int i=0; i<10; i++) {
if(i == 5) {
continue
}
print i
}
break
特定の条件を満たすときにループを中断する。
for(int i=0; i<10; i++) {
if(i == 5) {
break
}
print i
}
Discussion