
配列を扱う
- 配列を作成する
- 配列の要素数を得る
- 配列を結合する
- 配列の各要素を同じ値で埋める
- 配列の要素を繰り返して新しい配列を作成する
- 配列の一部を切り出す
- 配列を昇順や降順で並び替える
- 配列を逆順に並び替える
- 配列から要素を検索する
配列の配列を扱う
文字列を扱う
1配列を扱う
「配列」とは、同じ型の複数の変数をまとめて扱える型です。
1.1配列を作成する
Kuinでの配列は「[]型名」と書くことで、その型の値が複数集まった配列を表すことができます(図1-1)。
- func main()
- var array: []int
- do array :: #[3]int {[0, 0, 0]}
- do array[0] :: 5 {[5, 0, 0]}
- do array :: [1, 2, 3, 4] {[1, 2, 3, 4]}
- end func
2行目のように「[]int」とすると、int型の配列になります。
3行目のように「#[要素数]型名」と書くことで、指定した要素数の配列のインスタンス(実体)が生成されます。 各要素にはその型のデフォルト値が入り、int型の場合は0です。
4行目のように「配列の変数名[要素番号]」と書くことで、その配列の要素に値を読み書きできます。 要素番号は0から始まり、最後の要素では「要素数-1」になります。
5行目のように「[値1,値2,...,値n]」と書くことで、各要素の値を指定してインスタンスを生成することもできます。
1.2配列の要素数を得る
配列の要素数は要素数演算子「^」で得ることができます。 図1-2は、配列のすべての要素に順番に代入するプログラムです。
- func main()
- var array: []int :: #[10]int
- for i(0, ^array - 1)
- do array[i] :: i
- end for
- end func
3行目の「^array」で10が返ります。 4行目によって、array[0]には0が、array[1]には1が、array[9]には9が入ります。
1.3配列を結合する
2つの配列を結合するには、配列連結演算子「~」を使います(図1-3)。
- func main()
- var array1: []int :: [1, 3, 5]
- var array2: []int :: [2, 4, 6]
- var array3: []int :: array1 ~ array2 {[1, 3, 5, 2, 4, 6]}
- end func
1.4配列の各要素を同じ値で埋める
配列の各要素を同じ値で埋めるには、「.fill」メソッドを使います(図1-4)。
- func main()
- var array: []int
- do array :: #[5]int {[0, 0, 0, 0, 0]}
- do array.fill(123) {[123, 123, 123, 123, 123]}
- end func
1.5配列の要素を繰り返して新しい配列を作成する
配列の要素を繰り返して新しい配列を作成するには、「.repeat」メソッドを使います(図1-5)。
- func main()
- var array: []int :: [3, 5] {[3, 5]}
- var array2: []int :: array.repeat(4) {[3, 5, 3, 5, 3, 5, 3, 5]}
- end func
1.6配列の一部を切り出す
配列の一部を切り出すには、「.sub」メソッドを使います(図1-6)。
- func main()
- var array: []int :: [1, 2, 3, 4, 5, 6] {[1, 2, 3, 4, 5, 6]}
- var array2: []int :: array.sub(3, 2) {[4, 5]}
- var array3: []int :: array.sub(2, -1) {[3, 4, 5, 6]}
- end func
「.sub(a, b)」と書くと、a番目の要素から、b個分の要素が切り出されます。 bに-1を指定すると、配列の最後の要素まで切り出されます。
1.7配列を昇順や降順で並び替える
配列を昇順で並び替えるには「.sort」メソッドを使い、降順で並び替えるには昇順で並べた後に「.reverse」メソッドで逆順にします(図1-7)。
- func main()
- var array: []int :: [3, 6, 2, 4, 1, 2] {[3, 6, 2, 4, 1, 2]}
- do array.sort() {[1, 2, 2, 3, 4, 6]}
- do array.reverse() {[6, 4, 3, 2, 2, 1]}
- end func
「.sort」メソッドは、配列の要素の型が大小比較できる場合でのみ使えます。
1.8配列を逆順に並び替える
配列を逆順に並び替えるには、「.reverse」メソッドを使います(図1-8)。
- func main()
- var array: []int :: [3, 6, 2, 4, 1, 2] {[3, 6, 2, 4, 1, 2]}
- do array.reverse() {[2, 1, 4, 2, 6, 3]}
- end func
1.9配列から要素を検索する
配列から要素を検索するには、「.find」「.findLast」メソッドを使います(図1-9)。
- func main()
- var array: []int :: [3, 6, 5, 4, 5, 1]
- var pos: int
- do pos :: array.find(5, -1) {2}
- do pos :: array.find(5, 2) {2}
- do pos :: array.find(5, 3) {4}
- do pos :: array.find(5, 5) {-1}
- do pos :: array.findLast(5, -1) {4}
- do pos :: array.findLast(5, 4) {4}
- do pos :: array.findLast(5, 3) {2}
- do pos :: array.findLast(5, 1) {-1}
- end func
「.find(a, b)」と書くと、b番目の要素からaを探して、見つかった要素番号を返します。 見つからなければ-1を返します。 「.findLast(a, b)」も同様ですが、配列の末尾から先頭に向かう方向に探します。
配列の中身が昇順に並んでいるときには「.findBin」メソッドで高速に検索(二分探索)できます。 同じ配列を何度も検索する場合には一度「.sort」メソッドで昇順に並べ替えてから「.findBin」を使うと良いでしょう(図1-10)。
- func main()
- var array: []int :: [1, 2, 4, 6, 7] {昇順に並んだ配列}
- var pos: int :: array.findBin(6) {3}
- end func
見つかったときには要素番号が、見つからなかったときには-1が返ります。 「.findBin」メソッドは、配列の要素の型が大小比較できる場合でのみ使えます。
2配列の配列を扱う
2.1配列の配列を扱う
Kuinでは多次元配列は、配列の配列で扱います。 つまり、2次元のint型の配列は「[][]int」のように、配列をさらに配列にして扱います(図2-1)。
- func main()
- var array: [][]int :: [[1, 2], [3, 4, 5], [6]]
- end func
この場合の要素は、表2-1のように並ぶイメージになります。
1 | 2 | |
3 | 4 | 5 |
6 |
多次元配列の各次元の要素数が決まっているとき(つまり2次元の場合は長方形)、配列のインスタンスを一度に生成することができます(図2-2)。
- func main()
- var array: [][][]int :: #[3, 2, 5]int
- end func
この例ではarray[0][0][0]からarray[2][1][4]までの要素が作られます。 要素の値はデフォルト値(int型の場合は0)になります。
3文字列を扱う
3.1文字列を扱う
Kuinでは文字列は、文字型の配列「[]char」で扱います。 このため、配列に用意された機能はすべて文字列でも使えます(図3-1)。
- func main()
- var str1: []char :: "abc"
- var str2: []char :: "def"
- var str3: []char :: str1 ~ str2 {"abcdef"}
- end func
「"abc"」とは「['a', 'b', 'c']」と同じ意味で、文字列型でのみ使える書き方です。
3.2別の型から文字列型へ変換する
int型などの別の型から文字列型へ変換するには「.toStr」メソッドを使います(図3-2)。
- func main()
- var n: int :: 5
- var x: float :: 1.23
- var str1: []char :: n.toStr() {str1 = "5"}
- var str2: []char :: x.toStr() {str2 = "1.23"}
- end func
「.toStr」メソッドが使える型は、int型、float型、char型、bool型、各ビット型、[]char型、クラスです。
3.3文字列型からint型やfloat型へ変換する
文字列型からint型やfloat型へ変換するには、それぞれ「.toInt」「.toFloat」メソッドを使います(図3-3)。
- func main()
- var str1: []char :: "5"
- var str2: []char :: "1.23"
- var existed: bool
- var n: int
- var x: float
-
- do n :: str1.toInt(&existed) {existed = true, n = 5}
- do x :: str2.toFloat(&existed) {existed = true, x = 1.23}
- end func
「.toInt」「.toFloat」メソッドの引数には、変換に成功するとtrueが、失敗するとfalseが返ります。
3.4文字列中に変数の値を埋め込む
文字列中に変数の値を埋め込むには、「\{変数}」と書きます(図3-4)。
- func main()
- var n: int :: 1234
- var str: []char :: "n = \{n}" {" n = 1234 "}
- end func
「"\{n}"」と書くと、コンパイル時に「"" ~ (n).toStr() ~ ""」に置換されます。 変数だけでなく「"\{1 + 2}"」など任意の式が書けます。
3.5文字列を比較する
「=」や「<」などの比較演算子で、文字列の大小を辞書順(辞書でどちらが先に出てくるか)で比較できます。 ただし、各文字の大小は文字コードの大小で決まります。 文字列のインスタンスが一致しているかを比較したり、nullかどうかを比較するには、参照比較演算子「=&」「<>&」を使います(図3-5)。
- func main()
- var s1: []char :: "pen"
- var s2: []char :: "pencil"
- var s3: []char :: "pencil"
- var s4: []char :: s2
- var b: bool
- do b :: s1 <= s2 {true}
- do b :: s1 >= s2 {false}
- do b :: s2 = s3 {true}
- do b :: s2 =& s3 {false}
- do b :: s2 =& s4 {true}
- do b :: s2 =& null {false}
- end func
3.6文字列を置換する
文字列中のある文字列を別の文字列に置換するには「.replace」メソッドを使います(図3-6)。
- func main()
- var s1: []char :: "abc<br>def<br>g"
- var s2: []char :: s1.replace("<br>", "/") {"abc/def/g"}
- end func
3.7文字列を区切り文字列で分割する
文字列を区切り文字列で配列に分割するには「.split」メソッドを使います(図3-7)。
- func main()
- var s: []char :: "abc<br>def<br>g"
- var ss: [][]char :: s.split("<br>") {["abc", "def", "g"]}
- end func
3.8配列を区切り文字列で結合する
配列を区切り文字列で1つの文字列に結合するには「.join」メソッドを使います(図3-8)。
- func main()
- var ss: [][]char :: ["abc", "def", "g"]
- var s: []char :: ss.join("<br>") {"abc<br>def<br>g"}
- end func
3.9文字列の左右の余白を削除する
文字列の左右の余白を削除するには「.trim」「.trimLeft」「.trimRight」メソッドを使います(図3-9)。
- func main()
- var s1: []char :: " a b c "
- var s2: []char
- do s2 :: s1.trim() {"a b c"}
- do s2 :: s1.trimLeft() {"a b c "}
- do s2 :: s1.trimRight() {" a b c"}
- end func
「.trim」「.trimLeft」「.trimRight」メソッドで、それぞれ左右、左側のみ、右側のみの余白が削除されます。 削除される余白は、タブ文字、改行文字、半角スペースなどです(文字コードで、0x09以上0x0D以下、0x20、0xA0)。
3.10文字列を大文字や小文字で揃える
文字列を大文字や小文字で揃えるには、それぞれ「.upper」「.lower」メソッドを使います(図3-10)。
- func main()
- var s1: []char :: "Kuin Programming Language"
- var s2: []char
- do s2 :: s1.upper() {"KUIN PROGRAMMING LANGUAGE"}
- do s2 :: s1.lower() {"kuin programming language"}
- end func