Ruby 配列 基本と応用 スクリプトの書き方

バイオインフォ道場、くまぞうです。

配列は、複数の値を管理する入れ物のようなものです。データを順番に管理します。参照や編集・追加・削除などを行うことができます。繰り返し処理で発生したデータを順番に1つずつ保存したり、必要になったときに対応する番号でデータを読み出したりするような使い方をします。

スポンサーリンク



配列の基本的な使い方

配列は、データを順番に管理します。この順番のことを「添字」や「インデックス」と呼びますが、配列を使う場合はこれらの番号を使ってデータ操作を行います。配列に名前を付けて生成し、先頭を0番のデータ、次のデータを1番のデータというようにデータを追加します。追加したデータは、番号を使って参照・編集・追加・削除などを行うことができます。

生成

配列の生成は簡単です。空の配列を作ることもできるし、予めデータがセットされた配列を作ることもできます。

  aaa = []                     # 空の配列
  bbb = ["AAA", 123, "CCC"]
  ccc = Array.new              # 空の配列。生成に細かい操作を加えたい場合に使います。

参照

配列を参照する場合は、配列名[index番号]でアクセスします。0番が先頭です。最後は「要素数-1」ですが、「-1」番も同様に最後を指します。

  bbb = ["AAA", 123, "CCC"]
  puts bbb[0]                   # AAA
  puts bbb[bbb.length-1]        # CCC。配列長さを取得。
  puts bbb[-1]                  # CCC
  puts bbb[0..1]                # ["AAA", 123]。インデックス0〜1の部分配列。
  puts bbb.values_at(0,1)       # ["AAA", 123]。インデックス0、1の部分配列。(任意)
  puts bbb[100]                 # 末尾を超えたらnilが返される

編集

配列要素は書き換えることが出来ます。配列のインデックスを指定して、新しいデータを代入すると、指定したデータを更新出来ます。

  bbb = ["AAA", 123, "CCC"]
  puts bbb[0]                   # AAA
  bbb[0] = "aaa"
  puts bbb[0]                   # aaa

追加

配列末尾にデータを追加することができます。配列サイズは自動で伸長されます。

  bbb = ["aaa", 123, "CCC"]
  bbb << "DDD"
  puts bbb                      # ["aaa", 123, "CCC", "DDD"]

挿入・削除

配列途中にデータを追加・削除することができます。配列サイズは自動で調整されます。

  bbb = ["aaa", 123, "CCC"]
  bbb[0,0] = "AAA"              # 先頭に挿入
  puts bbb                      # ["AAA", "aaa", 123, "CCC", "DDD"]
  bbb[1,0] = [222, 333]         # 先頭の次から挿入
  puts bbb                      # ["AAA", 222, 333, "aaa", 123, "CCC", "DDD"]
  bbb[1,2] = []                 # 先頭の次から2個削除(追加したものを消す)
  puts bbb                      # ["AAA", "aaa", 123, "CCC", "DDD"]

配列の便利な使い方

基本的な操作以外にソートやデータ検索などの操作を簡単に行えるように、たくさんのメソッドが提供されています。よく使いそうなものを紹介します。

ソート・リバース

ソートできます。本体自体は書き換わらないので、別の配列として受け取るか、sort!を呼び出して直接変更する必要があります。

  aaa = (1..10).to_a.sample(5)  # [5, 6, 10, 8, 1]
  aaa.sorted = aaa.sort         # [1, 5, 6, 8, 10]
  aaa.rvrsed = aaa.sort.reverse # [10, 8, 6, 5, 1]
  aaa.sort!                     # 上書き
  puts aaa                      # [1, 5, 6, 8, 10]

要素の列挙

要素を1つ1つ列挙します。forやwhileに似たイテレーターを使います。

  puts aaa                      # [1, 5, 6, 8, 10]
  aaa.each {|x| puts x*x}       # 1, 25, 36, 64, 100
  aaa.each.with_index {|v, i| puts "i=#{i}, v=#{v}"}
                                # i=0, v=1
                                # i=1, v=5
                                # i=2, v=6
                                # i=3, v=8
                                # i=4, v=10

要素の検索

要素を検索します。存在をtrue/falseで返したり、インデックスを返したりします。

  puts aaa                      # [1, 5, 6, 8, 10]
  aaa.include?(1)               # true
  aaa.index(6)                  # 2 : 添字・インデックス

組合せを作る

順列・組合せなどを計算できます

  puts aaa                      # [1, 2, 3]
  aaa.combination(2).each {|x| print x}
                                # [1, 2][1, 3][2, 3]

プログラム

test_array.rb
#! /usr/bin/ruby

class MyData
  include Comparable

  attr :name
  attr :seq

  def initialize(entry)
    entry =~ /\n/
    @name, @seq = [$`,$'].map &:strip
  end

  def <=>(another)
    seq.length <=> another.seq.length
  end
end

ents = []                          # array new
sep = $/; $/ = '>'
File.open(ARGV[0]).each do |entry|
  next if entry == ">"
  ents << MyData.new(entry.chomp)  # array add
end
$/ = sep

ents.sort.each do |x|              # array sort
  print ">", x.name, "\n", x.seq, "\n"
end

プログラム実行

test_data.fasta
>entry1(length=8)
AAAAA
AAA
>entry2(length=6)
BBB
BBB
>entry3(length=7)
CCC
CCCC
test_array
$ test_array.rb test_data.fasta
>entry2(length=6)
BBB
BBB
>entry3(length=7)
CCC
CCCC
>entry1(length=8)
AAAAA
AAA

プログラムについて

test_array.rbでは、配列の使用例としてFASTA形式のファイルを長さ順に並び替えるプログラムを作りました。セパレーターを調整して(sep = $/; $/ = '>'…最後に戻します。$/ = sep)、ファイルからエントリー毎に読み出し、MyDataクラスに格納します。MyDataはいくつか生成されるので、配列のデータとして管理します(ents = [], ents << MyData.new(entry.chomp))。最後に、配列に対して追加とソート(カスタマイズされたソート:seqの長さで昇順ソート、Comparableモジュールのミックスインにて実現しています。)を実行しました。

スポンサーリンク



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です