1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyの文字列と配列の最大化問題の考察

2022-01-31 23:15:31

maxメソッド

b=[1,3,55,777,2,4,6,8,0]


数値データの場合、max は配列の最大値、min は配列の最小値を取得します。

b.max => 777
b.min => 0


文字列型配列の場合、サイズの比較はあまり意味がないのですが
rubyで示された例は

# enum.max -> obj
# enum.max { |a, b| block } -> obj
#a = %w(albatross dog horse)
#a.max = > "horse"
# a.max { |a, b| a.length <=> b.length } #=> "albatross"


実践実験

d=%w(albatross dog horse ddd dasgfds)
d.max => "horse"


ちょっと変、どうしたんだろう
これをより視覚的にわかりやすい数字の羅列で印刷

a = ["1", "3", "55", "777", "2", "4", "6", "8", "0" ;]
def max(first,*rest) 
 max=first 
 rest.each do |x|
  p "---#{x}--#{max}"
  max=x if x>max 
  p "---#{x}--#{max}"
  max 
end


実行

コピーコード コードは以下の通りです。
a.max

その結果は

"---3--1"
"---3--3"
"---55--3"
""---55--55"
""---777--55"
""---777--777"
""----2---777"
""----2---777"
""---4---777"
""---4---777"
""---6----777"
""---6---777"
""---8---777"
""---8---8"
""---0--8"
""---0---8"
 => "8"


問題発生, "8" > "777" => 真, 再試行

"7" > "777" => false
"6" > "777" => false
"9" > "777" => true
"10" > "777" => false
"11" > "777" => false
"70" > "777" => false
"80" > "777" => true


そろそろクラッシュする、法律が不親切だ、なぜならmaxでサイズを比較する方法は、以前は彼がASCIIでサイズを判断していると思っていた、今日ソートの問題を読んでこれを知った、実は辞書ソートで最大値を取っているのだ。

ここで、Rubyのsortをざっと見てみましょう。

ソートメソッド

ary.sort -> new_ary
ary.sort { |a, b| block } -> new_ary
enum.sort_by { |obj| block } -> array
enum.sort_by -> an_enumerator


インスタンス

h=['1','3','13','10','7']
 A. p h.sort
 B. p h.sort{|a,b| a.to_i <=> b.to_i}
 C. p h.sort_by{|x| x.to_i}



出力は次のようになります。

A. ["1", "10", "13", "3", "7"] 
B. ["1", "3", "7", "10", "13"] 
C. ["1", "3", "7", "10", "13"]



1. ブロックが指定されていない場合、デフォルトで辞書順にソートされます。
2. ブロックが指定されている場合、ブロックの定式化法における値の大きさでソートされます。
3. sort_byメソッドは、ブロックのコードを実行して生成された結果でソートするため、1要素につき1回のブロック呼び出ししか行わず、Bよりも効率的である。