Class: MetricTools::Table
- Inherits:
-
Object
- Object
- MetricTools::Table
- Defined in:
- lib/metric_tools/table.rb
Overview
2次元配列のデータ構造を簡単に扱うためのクラス
Class Method Summary collapse
-
.create(rows, cols, &proc) ⇒ Object
Tableクラスのインスタンスを生成します.
-
.create_with_array(array) ⇒ Object
Tableクラスのインスタンスを生成します.
Instance Method Summary collapse
-
#[](i, j) ⇒ Object
インデクサを用いてアクセスします 表の大きさを超えていると nilが返ります。.
-
#[]=(i, j, val) ⇒ Object
インデクサを用いてアクセスします 表の大きさを超えているとき、自動的に拡張します.
- #add_below(table) ⇒ Object
- #build(rows, cols, &proc) ⇒ Object
- #collect(&proc) ⇒ Object
-
#cols ⇒ Object
tableの幅(列数)を取得します.
-
#each(&proc) ⇒ Object
全データに対して処理を行います.
-
#each_with_index(&proc) ⇒ Object
全データに対して処理を行います。(i, j)にデータの座標が入ります。.
-
#header ⇒ Object
一行目を配列で返します.
-
#height ⇒ Object
tableの高さ(行数)を取得します.
-
#initialize ⇒ Table
constructor
A new instance of Table.
-
#output_csv_file(path) ⇒ Object
csvファイルとして出力します.
- #output_file_with_seperator(s, path) ⇒ Object
-
#output_tsv_file(path) ⇒ Object
tsvファイルとして出力します.
-
#print_csv ⇒ Object
コンソールにcsv形式で出力します.
-
#print_for_docs ⇒ Object
コンソールにtsv形式で出力します.
-
#print_pretty ⇒ Object
コンソールに綺麗な表形式で出力します(Hirbを使用).
- #print_with_seperator(s) ⇒ Object
-
#rows ⇒ Object
tableの高さ(行数)を取得します.
-
#to_a ⇒ Object
2次元配列を返します。自身は変更されません。.
-
#to_obj ⇒ Object
一行目をkeyとしたhashのarrayとして返します。 自身は変更されません。.
-
#width ⇒ Object
tableの幅(列数)を取得します.
Constructor Details
#initialize ⇒ Table
Returns a new instance of Table.
10 11 12 |
# File 'lib/metric_tools/table.rb', line 10 def initialize @_inner_data = {} end |
Class Method Details
.create(rows, cols, &proc) ⇒ Object
Tableクラスのインスタンスを生成します
表の幅、高さを指定し、内容をブロックで指定します。 ブロックの返り値が、表の(i, j)の位置に入ります。
Table.create(10, 5) {|i, j|
return "set to (#{i}, #{j})"
}
23 24 25 26 |
# File 'lib/metric_tools/table.rb', line 23 def create(rows, cols, &proc) table = Table.new table.build(rows, cols, &proc) end |
.create_with_array(array) ⇒ Object
Tableクラスのインスタンスを生成します
2次元配列を元にTableクラスに変換します。
array = [[1, 2, 3], [4, 5, 6], [9, 0, '#']]
Table.create_with_array(array)
34 35 36 37 38 |
# File 'lib/metric_tools/table.rb', line 34 def create_with_array(array) Table.create(array.length, array[0].length) {|i, j| array[i][j] } end |
Instance Method Details
#[](i, j) ⇒ Object
インデクサを用いてアクセスします 表の大きさを超えていると nilが返ります。
table[1, 10]
47 48 49 |
# File 'lib/metric_tools/table.rb', line 47 def [](i, j) @_inner_data[index_to_key(i, j)] end |
#[]=(i, j, val) ⇒ Object
インデクサを用いてアクセスします 表の大きさを超えているとき、自動的に拡張します
table[1, 10] = val
56 57 58 59 60 |
# File 'lib/metric_tools/table.rb', line 56 def []=(i, j, val) raise "can't specify negative number for position." if i < 0 || j < 0 @_inner_data[index_to_key(i, j)] = val end |
#add_below(table) ⇒ Object
100 101 102 103 104 105 |
# File 'lib/metric_tools/table.rb', line 100 def add_below(table) table.each_with_index{|cell, i, j| self[i, j+self.height] = cell } self end |
#build(rows, cols, &proc) ⇒ Object
243 244 245 246 247 248 249 250 |
# File 'lib/metric_tools/table.rb', line 243 def build(rows, cols, &proc) for i in 0..rows-1 for j in 0..cols-1 @_inner_data[index_to_key(i, j)] = proc.call(i, j) end end self end |
#collect(&proc) ⇒ Object
179 180 181 182 183 184 |
# File 'lib/metric_tools/table.rb', line 179 def collect(&proc) new_one = Table.create(self.rows, self.cols){|i, j| proc.call(self[i, j], i, j) } new_one end |
#cols ⇒ Object
tableの幅(列数)を取得します
77 78 79 |
# File 'lib/metric_tools/table.rb', line 77 def cols self.width end |
#each(&proc) ⇒ Object
全データに対して処理を行います
table.each {|cell|
cell += 10
}
160 161 162 163 164 |
# File 'lib/metric_tools/table.rb', line 160 def each(&proc) @_inner_data.keys.each{|key| proc.call(@_inner_data[key]) } end |
#each_with_index(&proc) ⇒ Object
全データに対して処理を行います。(i, j)にデータの座標が入ります。
table.each {|cell, i, j|
cell = i + j * table.width
}
172 173 174 175 176 177 |
# File 'lib/metric_tools/table.rb', line 172 def each_with_index(&proc) @_inner_data.keys.each{|key| i, j = key_to_index(key) proc.call(@_inner_data[key], i, j) } end |
#header ⇒ Object
一行目を配列で返します
110 111 112 113 114 115 116 |
# File 'lib/metric_tools/table.rb', line 110 def header ret = [] for i in 0...self.width ret[i] = self[0, i] end ret end |
#height ⇒ Object
tableの高さ(行数)を取得します
84 85 86 87 88 89 90 91 |
# File 'lib/metric_tools/table.rb', line 84 def height max = 0 for key in @_inner_data.keys i, j = key_to_index(key) max = i if max < i end return max + 1 end |
#output_csv_file(path) ⇒ Object
csvファイルとして出力します
218 219 220 |
# File 'lib/metric_tools/table.rb', line 218 def output_csv_file(path) output_file_with_seperator(",", path) end |
#output_file_with_seperator(s, path) ⇒ Object
229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/metric_tools/table.rb', line 229 def output_file_with_seperator(s, path) puts "start output >> #{path}..." ret = '' to_a.each{|row| ret << row.join(s) + "\n" } File.open(path, 'w') {|fp| fp.write ret } puts "finish" end |
#output_tsv_file(path) ⇒ Object
tsvファイルとして出力します
225 226 227 |
# File 'lib/metric_tools/table.rb', line 225 def output_tsv_file(path) output_file_with_seperator("\t", path) end |
#print_csv ⇒ Object
コンソールにcsv形式で出力します
198 199 200 |
# File 'lib/metric_tools/table.rb', line 198 def print_csv print_with_seperator(",") end |
#print_for_docs ⇒ Object
コンソールにtsv形式で出力します
205 206 207 |
# File 'lib/metric_tools/table.rb', line 205 def print_for_docs print_with_seperator("\t") end |
#print_pretty ⇒ Object
コンソールに綺麗な表形式で出力します(Hirbを使用)
191 192 193 |
# File 'lib/metric_tools/table.rb', line 191 def print_pretty puts Hirb::Helpers::Table.render @data.to_a, :headers => @headers, :resize => false end |
#print_with_seperator(s) ⇒ Object
209 210 211 212 213 |
# File 'lib/metric_tools/table.rb', line 209 def print_with_seperator(s) to_a.each{|row| puts row.join(s) } end |
#rows ⇒ Object
tableの高さ(行数)を取得します
96 97 98 |
# File 'lib/metric_tools/table.rb', line 96 def rows self.height end |
#to_a ⇒ Object
2次元配列を返します。自身は変更されません。
table.to_a => [[1,2,3], [4,5,6], [9,0,'#']]
122 123 124 125 126 127 128 129 130 131 |
# File 'lib/metric_tools/table.rb', line 122 def to_a ret = [] @_inner_data.each{|key, val| i, j = key_to_index(key) ret[i] ||= [] ret[i][j] = val } ret end |
#to_obj ⇒ Object
一行目をkeyとしたhashのarrayとして返します。 自身は変更されません。
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/metric_tools/table.rb', line 137 def to_obj ret = [] self.header.each_with_index do |key, index| @_inner_data.each do |k, val| i, j = key_to_index(k) next if i == 0 # when header row if j == index ret[i-1] ||= {} ret[i-1][key] = val end end end ret end |
#width ⇒ Object
tableの幅(列数)を取得します
65 66 67 68 69 70 71 72 |
# File 'lib/metric_tools/table.rb', line 65 def width max = 0 for key in @_inner_data.keys i, j = key_to_index(key) max = j if max < j end return max + 1 end |