RubyでEnumerable繰り返し処理を扱うまとめ

| コメント(0) | トラックバック(0)

Enumerableを使っての繰り返し処理のまとめメモ公開。

ruby
Enumerableは繰り返し処理を簡単にするもの、配列、HASH等
繰り返しを行なうクラスのための Mix-in


#各要素に対しての処理
   map             ブロックの結果を返す
   all?            ture false チェック、全ての要素の条件を満たす場合
   any?            ture false チェック、1つの要素の条件を満たす場合
   reverse_each    eachの逆順
   each_with_index 繰り返し indexをつける
   each_cons       引数個区切り、重複あり
   each_slice      引数個区切り、重複なし
   cycle           引数回繰り返し

# パターンマッチする
   grep

# 合計の計算
   inject           合計  Ruby1.8.7
   reduce           別名


# 要素の取得
   min
   max
   minmax
   min_by            block評価で判定
   max_by            block評価で判定
   minmax_by         block評価で判定
   first             最初の要素
   find              block評価で最初に一致した要素
   detect            findと同じ
   select            block評価で一致した要素全て
   reject            select の逆 一致した要素除外
   partition         select,rejectを同時に求める
   count             block評価した数


# ソート
   sort               昇順
   sort.reverse       降順
   sort_by            blockソート
                      2次元配列のソート [昇順,降順] [降順,昇順]

# 配列の並列処理
   zip
ruby
# -*- coding: utf-8 -*-
# 各要素に対しての処理
#
# map             ブロックの結果を返す
# all?            ture false チェック、全ての要素の条件を満たす場合
# any?            ture false チェック、1つの要素の条件を満たす場合
# reverse_each    eachの逆順
# each_with_index 繰り返し indexをつける
# each_cons       引数個区切り、重複あり
# each_slice      引数個区切り、重複なし
# cycle           引数回繰り返し

# map
[2,4,6,8].map{ |x| x*x}    #=>[4, 16, 36, 64]
[2,4,6,8].map{ |x| [x,x^2,x^3]}
    #=> [[2, 0, 1], [4, 6, 7], [6, 4, 5], [8, 10, 11]]

# all?
(1..4).all? {|x| x >=1  }   #=> true
(1..4).all? {|x| x >=2  }   #=> false

# any?
[2,4,5].any?{ |x| x >= 5}  #=> true
[2,4,5].any?{ |x| x >  5}  #=> false

# reverse_each
(1..5).reverse_each do |i|
  print i , " "
end
    #=> 5 4 3 2 1 


# each_with_index
(10..15).each_with_index do |val,j|
  puts "#{j} #{val}"
end
    #=> 0 10
    #=> 1 11
    #=> 2 12
    #=> 3 13
    #=> 4 14
    #=> 5 15


# each_cons
(1..10).each_cons(3){ |v| p v }
   #=> [1, 2, 3]
   #=> [2, 3, 4]
   #=> [3, 4, 5]
   #=> [4, 5, 6]
   #=> [5, 6, 7]
   #=> [6, 7, 8]
   #=> [7, 8, 9]
   #=> [8, 9, 10]

# each_slice
(1..10).each_slice(3){ |v| p v }
   #=> [1, 2, 3]
   #=> [4, 5, 6]
   #=> [7, 8, 9]
   #=> [10]


# cycle
p (1..3).cycle(3).to_a
   #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]







# パターンマッチする
#
# grep

# gpre
a = %w[hoge fuga hoga]
a.grep("hoge")    #=> ["hoge"]

# grep 正規表現
a = %w[hoge fuga hoga]
a.grep(/^h/)      #=> ["hoge", "hoga"]

# grep.map block利用
a = %w[hoge fuga hoga]
a.grep(/^h/).map {|s| s.upcase }  #=>["HOGE", "HOGA"]

# grep クラスorモジュール名
[1,2,"3"].grep(Numeric)           #=>[1, 2]
[1,2,"3"].grep(String)            #=>["3"]

# grep rang
[9,10,11,12].grep(1..10)          #=>[9, 10]




# 合計の計算
#
# inject  合計  Ruby1.8.7

[2,4,6].inject(: )   #=> 12
[2,4,6].inject(:-)   #=> -8
[2,4,6].inject(:*)   #=> 48
[20,2,2].inject(:/)  #=> 5

# reduce 別名
[2,4,6].reduce(: )  #=> 12



# 要素の取得
#
# min
# max
# minmax
# min_by     block評価で判定
# max_by     block評価で判定
# minmax_by  block評価で判定
# first      最初の要素
# find       block評価で最初に一致した要素
# detect     findと同じ
# select     block評価で一致した要素全て
# reject     select の逆 一致した要素除外
# partition  select,rejectを同時に求める
# count      block評価した数
a = [11,13,17,19,23]
a.min                     #=> 11
a.max                     #=> 23
a.minmax                  #=> [11, 23]

# block評価で判定
a.min_by{|i| i % 10 }     #=> 11
a.max_by{|i| i % 10 }     #=> 19
a.minmax_by{|i| i % 10 }  #=> 19

a.first                   #=> 11
a.first(2)                #=> [11, 13]


# find or detect
a = [1, 2, 3, 4, 5]
a.find{ |i| (i % 3) == 0}   #=> 3
a.detect{ |i| (i % 3) == 0} #=> 3

# select
a = [1, 2, 3, 4, 5]
a.select{ |i| (i % 2) == 0 }  #=> [2, 4]

# reject
a = [1, 2, 3, 4, 5]
a.reject{ |i| (i % 2) == 0 }  #=> [1, 3, 5]

# partition
a = [1, 2, 3, 4, 5]
a.partition{ |i| (i % 2) == 0 }
   #=> [[2, 4], [1, 3, 5]]

# count
a = [1, 2, 3, 4, 5]
a.count                      #=> 5
a.count{ |i| (i % 2) == 0 }  #=> 2



# ソート
#
# sort          昇順
# sort.reverse  降順
# sort_by       blockソート
#               2次元配列のソート [昇順,降順] [降順,昇順]

a = [3,1,4,1,5,9]
a.sort             #=> [1, 1, 3, 4, 5, 9]
a.sort.reverse     #=> [9, 5, 4, 3, 1, 1]

#sort_by
a = [[1,5], [1,2], [1,9], [2,2], [2,9],[7,5],[7,0]]
#[昇順,降順]
p a.sort_by{|i| [i[0],-i[1]] }
    #=> [[1, 9], [1, 5], [1, 2], [2, 9], [2, 2], [7, 5], [7, 0]]

#[降順,昇順]
p a.sort_by{|i| [-i[0],i[1]] }
    #=> [[7, 0], [7, 5], [2, 2], [2, 9], [1, 2], [1, 5], [1, 9]]



# 配列の並列処理
#
# zip
months = %w[Jan Feb Mar]
apple  = [30,40,50]
banana = [50,25,40]
orange = [34,83,95]

(1..(months.length)).zip(months,apple,banana,orange) do |index,m,a,b,o|
  print "#{index} #{m} #{a} #{b} #{o}\n"
end
  #=> 1 Jan 30 50 34
  #=> 2 Feb 40 25 83
  #=> 3 Mar 50 40 95

関連記事

トラックバック(0)

トラックバックURL: http://mukaer.com/cgi-bin/mt/mt-tb.cgi/87

コメントする

PR

PR





検索

Loading

メニュー

twitter