バイオインフォ道場、くまぞうです。
配列は、複数の値を管理する入れ物のようなものです。データを順番に管理します。参照や編集・追加・削除などを行うことができます。繰り返し処理で発生したデータを順番に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モジュールのミックスインにて実現しています。)を実行しました。
![バイオインフォ 道場 [bioinfo-Dojo]](https://bioinfo-dojo.net/wp-content/uploads/2016/03/some_object_luca-bravo-alS7ewQ41M8-unsplash.jpg)

