配列は、よく扱うデータ構造の1つです。 そのため、配列を操作するためのメソッドが数多く用意されています。 並べ替え、逆順、要素の挿入など、その種類は多岐にわたります。
これらのメソッドには、元の配列を変更する破壊的なものと、新しい配列を返して元の配列を変更しない非破壊的なものがあります。
ここでは、配列を扱うときによく使われるメソッドをいくつか紹介します。
配列に要素を挿入するには、insertメソッドを使います。このメソッドは、インデックスと要素を引数に取ります。
要素は指定したインデックスの位置に挿入され、それ以降の要素は1つずつ右にずれます。
インデックスが範囲外の場合、IndexErrorが発生します。
numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]
numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)
配列から特定の要素を削除したいときは、deleteメソッドを使います。このメソッドは、要素を引数に取ります。
削除された要素が戻り値として返ります。
配列にその要素が存在しない場合は、nilが返ります。
numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers # => [1, 3]
配列の最初または最後の要素を取得したいときは、firstメソッドとlastメソッドを使います。
これらのメソッドは、返す要素の数を指定する省略可能な引数を取ります。
インデックスの0や-1を使ったり、範囲を使ったりするよりも、読みやすく書けます。
配列が空の場合は、Enumerable::EmptyErrorが発生します。
numbers = [1, 2, 3]
numbers.first # => 1
numbers.last # => 3
numbers.first(2) # => [1, 2]
numbers.last(2) # => [2, 3]
empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)
配列を逆順にしたいときは、reverseメソッドを使います。このメソッドは、要素を逆順にした新しい配列を返します。
reverseは新しい配列を返し、元の配列は変更しないことに注意してください。
元の配列自体を変更したい場合は、メソッド名の末尾に!を付けます。
numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers # => [1, 2, 3]
numbers.reverse! # => [3, 2, 1]
numbers # => [3, 2, 1]
+)appendメソッド(<<)は、配列にオブジェクトを追加したいときに便利です。
ただし、2つの配列を結合したいときは、+演算子を使います。これは、両方の配列の要素を持つ新しい配列を返します。
[1, 2] + [3, 4] # => [1, 2, 3, 4]
ある配列に別の配列を追加すると、その配列は1つの要素として追加されます。
[1, 2] << [3, 4] # => [1, 2, [3, 4]]
配列が空かどうかを調べるときは、empty?メソッドを使います。このメソッドは、配列が空であればtrueを、そうでなければfalseを返します。
配列の長さを0と比較するよりも、読みやすく書けます。
[].empty? # => true
[1, 2, 3].empty? # => false
配列中の要素のインデックスを取得したいときは、indexメソッドを使います。このメソッドは、要素を引数に取ります。
配列にその要素が存在しない場合は、nilが返ります。
numbers = [1, 2, 3]
numbers.index(2) # => 1
配列の要素数を知りたいときは、sizeメソッドを使います。
numbers = [1, 2, 3]
numbers.size # => 3
配列中に要素がいくつあるか数えたいときは、countメソッドを使います。
fruits = ["apple", "banana", "apple"]
fruits.count("apple") # => 2
fruits.count("banana") # => 1
fruits.count("watermelon") # => 0
配列を並べ替えたいときは、sortメソッドを使います。このメソッドは、要素を並べ替えた新しい配列を返します。
reverseと同様に、このメソッドは新しい配列を返し、元の配列は変更しません。
numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers # => [3, 2, 1]
numbers.sort! # => [1, 2, 3]
numbers # => [1, 2, 3]
Chaitanaはとても人気のテーマパークを経営しています。 アトラクションは、美しく手入れされた庭園のちょうど中心に1つだけです。The Biggest Roller Coaster in the World(TM)です。 この1つのアトラクションしかないにもかかわらず、世界中から人々が訪れ、Chaitanaのハイパーコースターに乗るために何時間も列に並びます。
このアトラクションには2つの列があり、それぞれがarrayで表されます。
公園のゲストをもっとうまく管理するためのコードを書くよう頼まれました。 ゲスト(そしてあなたの上司であるChaitana!)が不機嫌になる前に、次の関数をできるだけ早く実装する必要があります。
ColossalCoaster.add_to_queueメソッドを定義します。このメソッドは4つの引数<express_queue>, <normal_queue>, <ticket_type>, <person_name>をとり、その人の名前で更新された適切な列を返します。
<ticket_type>はInt32で、1がエクスプレス列、0が通常の列を表します。<person_name>は、それぞれの列に追加する人の名前です(Stringとして)。express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]
ある人が公園に遅れて到着しましたが、友達が待っている列に加わりたいと思っています。 しかし、友達がどこに並んでいるのかまったく分からず、電話をかけるための電波もありません。
ColossalCoaster.find_my_friendメソッドを定義します。このメソッドは2つの引数queueとfriend_nameをとり、その友達の名前が列の何番目にあるかを返します。
<queue>は、列に並んでいる人たちのarrayです。<friend_name>は、インデックス(列の何番目か)を探す友達の名前です。ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1
友達が見つかったので(上のタスク2)、遅れて来た人は、列の中の友達の位置に加わりたいと思っています。
ColossalCoaster.add_with_friendsメソッドを定義します。このメソッドは3つの引数queue、friend_name、person_nameをとります。
<queue>は、列に並んでいる人たちのarrayです。<friend_name>は、その人の位置に追加すべき友達の名前です。<person_name>は、そのインデックスの位置に追加する人の名前です。遅れて来た人の名前で更新された列を返します。
ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
列から、押したり、叫んだり、問題を起こしたりしている、本当に意地悪な人がいると聞きました。 その悪さをする人を、迷惑行為のために追い出さなければなりません!
ColossalCoaster.remove_from_queueメソッドを定義します。このメソッドは2つの引数queueとperson_nameをとります。
<queue>は、列に並んでいる人たちのarrayです。<person_name>は、追い出す必要がある人の名前です。意地悪な人の名前を除いて更新された列を返します。
ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]
管理上の目的で、ある列にいるすべての名前をアルファベット順に取得する必要があります。
ColossalCoaster.sorted_queueメソッドを定義します。このメソッドは1つの引数queue(列に並んでいる人たちのarray)をとります。
このメソッドは、arrayを並べ替えたコピーを返す必要があります。
ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']