🦁

[Groovy][QuPath] 章6 Groovy言語入門

2023/03/14に公開約6,200字

※ 画像解析ソフト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]のように指定する。

リストの1番目の要素を取得
List a = [1,2,3,4,5]
a[1]

2

Groovyではindexは0から始まる。リストの最初の要素を取り出す場合は、list[0]となる。


複数要素を取り出す場合は[]内にコンマ区切りで要素番号を入れるだけである。

リストの0番目と4番目の要素を取得
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という名前で参照できる。

リストから1要素ずつ取り出してprint
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はリストの各要素に処理をして、新たなリストとして返す。

リストの各要素から1を引いて、新たなリストとして保存
List list = [1,10,100]
List list2 = list.collect {
    it - 1
    }
print list2

findAll

リストの中から条件に合うものを抽出する。

リストから"a"のみ抽出
List list = ["a","a","b","c"]
list.findAll {
    it == "a"
    }

リストから"a"と"b"を抽出
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+=1i = 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

ログインするとコメントできます