読者です 読者をやめる 読者になる 読者になる

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)で前回検索場所の次の位置から検索しても処理としては同じようにいけるか。