// ◆文字列から"b"の文字が最初に現れる位置(先頭が0)を得る
a = "orange melon strawberry grape"
n = a.indexOf("b")
// 18
println(n)

// ◆その位置から5文字を切り出す
b = a.substring(n, n+5)
// berry
println(b)

// ◆文字列の一部置き換え
println(a.replace("mel", "lem"))

// ◆数値と文字列をそれぞれ加算、文字列連結する
// Javaと同じ。+は片方が文字列だと文字列になる
v1 = 10.2
v2 = "15.3"
// 25.5 10.215.3 25.5 15.310.2
v3 = v1 + Double.parseDouble(v2)
v4 = v1 + v2
v5 = Double.parseDouble(v2) + v1
v6 = v2 + v1
println("${v3} ${v4} ${v5} ${v6}")

// ◆配列の3番目の要素から3個を取り出し、文字列に連結して出力する
// Groovyでは、[]は実際には配列ではなくJavaのArrayListを生成しているので、
// add()などのメソッドが使える
arr = [ "orange", "melon", "strawberry", "grape", "apple", "banana" ]
arrsub = arr[2..4]
// strawberry grape apple
println(arrsub.join(" "))

// ◆要素の追加
arr.add("peach")

// ◆要素の検索
println("index of 'peach' is:" + arr.indexOf("peach"))

// ◆配列から変数への一括代入
(e1, e2, e3) = arrsub
println("${e1} ${e2} ${e3}")

harr = [ "orange":80, "melon":1200, "strawberry":350 ]
harr["grape"] = 450

// ◆マップのキーの存在有無をチェックする
// yes
println(("melon" in harr) ? "yes" : "no")
// no
println(("lemon" in harr) ? "yes" : "no")

// ◆マップのキー一覧をソートして、キーと値を出力する
// harr.sort()でマップのキー順に(k,v)組がソートされる
// ちなみにeachもforEachも記法は同じだが、eachはGroovyの実装でありクロージャを処理する、
// forEachはJava8の実装でありConsumerを処理すると内部実装に違いがある
harr.sort().each { k, v -> println("${k}\t${v}") }

// ◆既定値付き引数を持つ関数の定義
//   処理の記述自体はBeanShell(Java)やKotlinと同じ
def getFileNames(dir, ext=""){
    files = []
    new File(dir).listFiles().each {
        if(it.isFile() && (ext == "" || it.name.endsWith(ext))){ files.add(it.name) }
    }
    files
}
println(getFileNames(".").join(" "))
println(getFileNames(".", ".txt").join(" "))

// ◆可変長引数を持つ関数の定義
def getSum(int... nums){
    sum = 0
    nums.each{ sum += it }
    sum
}
// 46
println(getSum(10,11,12,13))

// end.