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

ネット偽善者でもいいじゃない

悩んでるなら面白いマンガ読もう

Ruby演習:sort_byの練習。配列内要素の絶対値、小さい順にソートするなど

プログラミング


ruby07 // Speaker Deck

 

slideでみつけた演習をやってみる

絶対値が小さい順に並び替えて表示する

44枚目のスライドで

「Arrayオブジェクト[3,1,-5]を絶対値が小さい順に並び替えて表示する」のコード

ぱっと探しただけでは配列の絶対値を求めるメソッドの使い方が英語しか出てこなかったので

 

答えから言うと

 

array = [3,1,-5]

#array配列をソートする
result = array.sort_by do |i|

  #ソートする際、要素の絶対値で評価する
  i.abs
end

 

#絶対値はあくまで do end 内で評価してるので、resultは配列内の値がそのままのかたちで反映される
p result #=> [1,3,-5]

で出来た!

 

絶対値をとって絶対値の小さい順でソートするには?

となると、配列内の絶対値をとって絶対値の値でソートするのはどうするんだろ?

と思って調べてみるとmapメソッドを用いる方法があるらしい↓

 

#arrayを定義
array = [3,1,-5]


#arrayの要素の絶対値をとる
list = array.map {|n| n.abs}
p list #=> [3,1,5]


#要素をsortする
result = list.sort_by do |i|
i
end


#結果を出力
p result #=> [1,3,5] 

 もしくは、いっぺんに記述するなら

array2 = [4,2,-6]
list2 = array2.map {|n| n.abs}.sort_by do |k|
k
end
p list2 #=> [2,4,6]

のような書き方でもOK

How to count the number of unique absolute values in an array with Ruby? - Stack Overflow

を参考にしました

 

mapメソッドってなんだ?って思ったらこれね

http://miyamae.github.io/rubydoc-ja/2.1.0/#!/method/-enumerable/i/map.html

各要素に対してブロックを評価した結果を全て含む配列を返します。

ブロックを省略した場合、上で説明した繰り返しを実行し、その結果として 得られる配列を返すような Enumerator オブジェクトを返します。

イメージとしては、配列のそれぞれの要素に何か計算なりなんなりを与えることができるメソッドっぽい

なので、例えば

 

array = [3,1,-5]

list = array.map {|i| i}

p list #=> [3,1,-5]

list2 = array.map {|i| i*2}

p list2 #=> [6,2,-10]

のように、iに何も計算を加えなかったら単純に元の配列が戻ってくるし2をかけると2倍の値の配列が生成するみたい

 

これは覚えていたほうが便利っぽい

 

要素に重複のないarrayをsort_byだけを使って、reverseと同様の結果を得られるコード

これは、上記のように do end 内で評価されたものは do end内だけで反映されるということを考慮すると簡単で

array=[3,4,2,1,5]
list = array.sort_by do |i|

  -i
end
p list #=> [5,4,3,2,1]

となる。do end内でiに負の符号を付けてもend後の出力の際には正の値になる

 

4番目のお題はよくわからないけど下記のようなコードでいいのかな?

もっと良い書き方がありそうだが・・・

#要素に重複のないarrayをsort_byだけを使って、reverseと同様の結果を得られるコード
array=[3,4,2,1,5]
list = array.sort_by do |i|
  i
end
#小さい順に並び替え済みかどうかを判定する
list.each do |k|
  if k < k+1
    puts "OK"
  elsif k > k+1
    puts "NG!"
  end
end
p list

 

ここまで書いてみて

 よくみたらスライドの最後に解答例あったorz