2012年2月23日木曜日

Kotlinの配列を色々触ってみた

Kotlinの配列を色々試してみた。

繰り返し処理

Scalaなどでもお馴染みのforcachforEachでぐるぐるまわします。
foreachforEachに指定する関数では、要素を「it」で参照できるみたいです。groovyちっくですね。
rubyのように、each_widh_indexみたいなので添字付きでぐるぐるまわすことはできないのかな。

var arr1 = array(1, 2, 3, 4)
arr1.forEach {println(it)}

配列の各要素を連結

おなじみのjoin関数を使って連結出来る。
// カンマで連結
arr.join(",")    // -> 1,2,3,4

// プレフィックス、サフィックスを指定して連結
arr.join(",", "<", ">")    // -> <1,2,3,4>

要素の中身全てが指定した条件を満たすかチェック

all関数を使用する。条件は、all関数の引数として指定してあげる。
// 全ての要素で条件をみたすことができない場合
var arr1 = array(1, 1, 1, 0)
arr1.all {it == 1}    // -> false

// 全ての要素で条件をみたすことが出来る場合
var arr2 = array(1, 1, 1, 1)
arr2.all {it == 1}    // -> true

// 文字列の場合
var str = array("1", "2", "3")
str.all {it <= "3"}    // -> true
str.all {it <= "2"}    // -> false

要素の中のどれか1つが指定した条件を満たすかチェック

any関数を使用するる。条件は、any関数の引数として指定してあげる。
// 要素ないに1つでも条件を満たす値がある場合
var arr1 = array(1, 0, 2, 0)
arr1.any {it == 1}    // -> true

// 要素ないの値が全て条件を満たさない場合
var arr2 = array("1", "2", "3")
arr2.any{it > "3"}    // -> false

要素の中で条件を満たす最初の値を取得する

他の言語でもお馴染みのfind関数を使います。使い方も他の言語と同じですね。
var arr1 = array(1, 0, 2, 0)
// 要素が見つかる場合
arr1.find {it == 0}    // -> 0
arr1.find {it == 2}    // -> 2

// 要素が見つからない場合
arr1.find {it == -1}    // -> null

要素の中で条件に一致したものを新しい配列で取得する

他の言語(Scala)でもお馴染みのfilter関数を使います。使い方も他の言語と同じですね。
var arr1 = array(1, 0, 2, 0)
arr1.filter {it % 2 == 0}    // -> [0, 2, 0]

var arr2 = array("1", "2", "3")
arr2.filter {it.length() == 1}    // -> ["1", "2", "3"]
// 条件に一致する要素が存在しない場合は、空の配列が戻ってきます。
arr2.filter {it.length() != 1}    // -> []

要素の中で条件に一致しないものを新しい配列で習得する

filterの逆ですね。これも他の言語(Scala)でもお馴染みのfilterNot関数を使います。使い方も他の言語と同じですね。
var arr1 = array(1, 0, 2, 0)
arr1.filterNot {it % 2 == 0}    // -> [1]

var arr2 = array("1", "2", "3")
arr2.filterNot {it.length() != 1}    // -> ["1", "2", "3"]
arr2.filterNot {it.length() == 1}    // -> []

各要素の値を変換して新しいCollectionを取得する。

ScalaにもあるflatMapを使ってあげるといけます。
引数の型パラメータと戻りの型パラメータが異なるから、flatMapに型パラメータ指定してあげないと動かなかった。
なんか間違ってるのかな?
ちなみに、arrayListやlinkedList関数は、「std.utilパッケージ」にあるのでimportしてあげないと使えないです。
// 各要素の値を2倍にする。
var arr1 = array(1, 2, 3)
arr1.flatMap<Int, Int> {(n) -> arrayList(n * 2)}    // -> [2, 4, 6]

// 各要素先頭にstr =を加える。
var arr2 = array("1", "2", "3")
arr2.flatMap<String, String>{(s) -> linkedList("str = ${s}")}    // -> [str = 1, str = 2, str = 3]