Kuina-chan

くいなちゃん2018年09月24日


プログラミング言語Kuin」の逆引き辞典2、配列と文字列の扱い方についてです。

目次

配列を扱う

「配列」とは、同じ型の複数の変数をまとめて扱える型です。

配列を作成する

Kuinでの配列は「[]型名」と書くことで、その型の値が複数集まった配列を表すことができます(配列)。
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]」と書くことで、各要素の値を指定してインスタンスを生成することもできます。

配列の要素数を得る

配列の要素数は要素数演算子「^」で得ることができます。 配列の要素数は、配列のすべての要素に順番に代入するプログラムです。
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が入ります。

配列を結合する

2つの配列を結合するには、配列連結演算子「~」を使います(配列連結)。
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
配列連結

配列の各要素を同じ値で埋める

配列の各要素を同じ値で埋めるには、「.fill」メソッドを使います(fillメソッド)。
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
fillメソッド

配列の要素を繰り返して新しい配列を作成する

配列の要素を繰り返して新しい配列を作成するには、「.repeat」メソッドを使います(repeatメソッド)。
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
repeatメソッド

配列の一部を切り出す

配列の一部を切り出すには、「.sub」メソッドを使います(subメソッド)。
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メソッド
「.sub(a, b)」と書くと、a番目の要素から、b個分の要素が切り出されます。 bに-1を指定すると、配列の最後の要素まで切り出されます。

配列を昇順や降順で並び替える

配列を昇順や降順で並び替えるには、それぞれ「.sort」「.sortDesc」メソッドを使います(ソート)。
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.sortDesc() {[6, 4, 3, 2, 2, 1]}
end func
ソート
「.sort」「.sortDesc」メソッドは、配列の要素の型が大小比較できる場合でのみ使えます。

配列を逆順に並び替える

配列を逆順に並び替えるには、「.reverse」メソッドを使います(逆順)。
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
逆順

配列をランダムに並び替える

配列をランダムに並び替えるには、「.shuffle」メソッドを使います(シャッフル)。
func main()
  var array: []int :: [1, 2, 3, 4, 5, 6]
  do array.shuffle()
end func
シャッフル
例えばトランプゲームでカードをシャッフルする場合などに便利です。

配列から要素を検索する

配列から要素を検索するには、「.find」「.findLast」メソッドを使います(配列の要素の検索)。
func main()
  var array: []int :: [3, 6, 5, 4, 5, 1]
  var pos1: int :: array.find(5, -1) {2}
  var pos2: int :: array.findLast(5, -1) {4}
end func
配列の要素の検索
(執筆中です!)
配列の中身が昇順に並んでいるときには「.findBin」メソッドで高速に検索(二分探索)できます。 同じ配列を何度も検索する場合には一度「.sort」メソッドで昇順に並べ替えてから「.findBin」を使うと良いでしょう(配列の要素の二分探索)。
func main()
  var array: []int :: [1, 2, 4, 6, 7] {昇順に並んだ配列}
  var pos: int :: array.findBin(6) {3}
end func
配列の要素の二分探索
見つかったときには要素番号が、見つからなかったときには-1が返ります。 「.findBin」メソッドは、配列の要素の型が大小比較できる場合でのみ使えます。

配列の配列を扱う

Kuinでは多次元配列は、配列の配列で扱います。 つまり、2次元のint型の配列は「[][]int」のように、配列をさらに配列にして扱います(配列の配列)。
func main()
  var array: [][]int :: [[1, 2], [3, 4, 5], [6]]
end func
配列の配列
この場合の要素は、配列の配列の例のように並ぶイメージになります。
配列の配列の例
1 2
3 4 5
6
多次元配列の各次元の要素数が決まっているとき(つまり2次元の場合は長方形)、配列のインスタンスを一度に生成することができます(多次元配列の初期化)。
func main()
  var array: [][][]int :: #[3, 2, 5]int
end func
多次元配列の初期化
この例ではarray[0][0][0]からarray[2][1][4]までの要素が作られます。 要素の値はデフォルト値(int型の場合は0)になります。

文字列を扱う

文字列を扱う

Kuinでは文字列は、文字型の配列「[]char」で扱います。 このため、配列に用意された機能はすべて文字列でも使えます(文字列型)。
func main()
  var str1: []char :: "abc"
  var str2: []char :: "def"
  var str3: []char :: str1 ~ str2 {"abcdef"}
end func
文字列型
「"abc"」とは「['a', 'b', 'c']」と同じ意味で、文字列型でのみ使える書き方です。

別の型から文字列型へ変換する

int型などの別の型から文字列型へ変換するには「.toStr」メソッドを使います(toStrメソッド)。
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メソッド
「.toStr」メソッドが使える型は、int型、float型、char型、bool型、各ビット型、[]char型、クラスです。

文字列型からint型やfloat型へ変換する

文字列型からint型やfloat型へ変換するには、それぞれ「.toInt」「.toFloat」メソッドを使います(toInt、toFloatメソッド)。
func main()
  var str1: []char :: "5"
  var str2: []char :: "1.23"
  var b: bool
  var n: int
  var x: float
  
  do b :: str1.toInt(&n) {b = true, n = 5}
  do b :: str2.toFloat(&x) {b = true, x = 1.23}
end func
toInt、toFloatメソッド
「.toInt」「.toFloat」メソッドは、変換に成功するとtrueが、失敗するとfalseが返ります。

文字列中に変数の値を埋め込む

文字列中に変数の値を埋め込むには、「\{変数}」と書きます(変数の埋め込み)。
func main()
  var n: int :: 1234
  var str: []char :: "n = \{n}" {"n = 1234"}
end func
変数の埋め込み
「"\{n}"」と書くと、コンパイル時に「"" ~ (n).toStr() ~ ""」に置換されます。 変数だけでなく「"\{1 + 2}"」など任意の式が書けます。

文字列を比較する

「=」や「<」などの比較演算子で、文字列の大小を辞書順(辞書でどちらが先に出てくるか)で比較できます。 文字列のインスタンスが一致しているかを比較するには、参照比較演算子「=&」「<>&」を使います(文字列の比較)。
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}
end func
文字列の比較

文字列を置換する

文字列中のある文字列を別の文字列に置換するには「.replace」メソッドを使います(文字列の置換)。
func main()
  var s1: []char :: "abc<br>def<br>g"
  var s2: []char :: s1.replace("<br>", "/") {"abc/def/g"}
end func
文字列の置換

文字列を区切り文字列で分割する

文字列を区切り文字列で配列に分割するには「.split」メソッドを使います(文字列の分割)。
func main()
  var s: []char :: "abc<br>def<br>g"
  var ss: [][]char :: s.split("<br>") {["abc", "def", "g"]}
end func
文字列の分割

配列を区切り文字列で結合する

配列を区切り文字列で1つの文字列に結合するには「.join」メソッドを使います(文字列の結合)。
func main()
  var ss: [][]char :: ["abc", "def", "g"]
  var s: []char :: ss.join("<br>") {"abc<br>def<br>g"}
end func
文字列の結合

文字列の左右の余白を削除する

文字列の左右の余白を削除するには「.trim」「.trimLeft」「.trimRight」メソッドを使います(文字列の余白の削除)。
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)

文字列を大文字や小文字で揃える

文字列を大文字や小文字で揃えるには、それぞれ「.upper」「.lower」メソッドを使います(大文字化と小文字化)。
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
大文字化と小文字化
1537762332jaf