map join split をそれぞれ使わずに実装する
map,join,splitについてそれぞれ練習として使わないで実装してみる。
まずは配列の値を二倍にするだけのmap処理から
# ary1 = [1,2,3] ary2 = ary1.map{|item| item * 2 } p ary2
は下記。明示的に出力してやる必要がある。
ary1 = [1,2,3] ary2 = Array.new ary1.each {|item| ary2.push(item * 2) } p ary2
下記はtab区切りテキストファイルにたいしてjoinを使わないで要素ごとに""でくくり”,”で区切った物
line = "" meibo.split("\t").each {|field| line += "\"#{field}\"" + "," } line = line.chop ary1.push(line)
繰り返しで入れると要素末尾にまで,がついてしまうのでchopで末尾を削る必要があって入れているが、違和感の残る処理。
splitを使わずに書くパターン。基本は区切り文字の位置を検索⇛そこまでの値を取得して配列に格納、その後その位置までの文字列を削除して再度次の区切り文字を検索のループ
STDIN.each_line do |meibo| meibo.chomp! ary1 = [] line = "" line = meibo.index(",") while line != nil do ary1.push(meibo.slice(0..line-1)) meibo.slice!(0..line) line = meibo.index(",") end ary1.push(meibo) pp ary1 end
indexは検索対象を発見できないとnilを返すのでループ条件に指定可能。一回一回取得した文字列を削除せず、index("," line+1)で前回検索場所の次の位置から検索しても処理としては同じようにいけるか。