2012年3月9日金曜日

Rubyで配列をソートする方法

ここでは、単一配列、多重配列、昇順、降順についてメモしました。
条件によるソートもあるのですが、それは追々…。

sort
数字
> a = [1,4,2,5,7,3,6,8,9]
=> [1, 4, 2, 5, 7, 3, 6, 8, 9]
> a.sort
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
文字列
> b = ["e","c","a","b","d"]
=> ["e", "c", "a", "b", "d"]
> b.sort
=> ["a", "b", "c", "d", "e"]

sort_by
多重配列
> c = [[2,"b"],[1,"a"],[3,"c"],[2,"a"]]
=> [[2, "b"], [1, "a"], [3, "c"], [2, "a"]]
> c.sort_by{|item| item[0]}
=> [[1, "a"], [2, "b"], [2, "a"], [3, "c"]]
多重ソート
上記の場合だと、同じ値の時、[2, "b"], [2, "a"]になっています。
これを[2, "a"], [2, "b"]2つめもキーにしてソートしたい場合は
配列で順番を指定します。便利!
> c = [[2,"b"],[1,"a"],[3,"c"],[2,"a"]]
=> [[2, "b"], [1, "a"], [3, "c"], [2, "a"]]
> c.sort_by{|item| [item[0],item[1]]}
=> [[1, "a"], [2, "a"], [2, "b"], [3, "c"]]
c.sort でもできるけど、想定通りになるかは…?
> c.sort
=> [[1, "a"], [2, "a"], [2, "b"], [3, "c"]]

降順ソート
単一配列
> a.sort.reverse
=> [9, 8, 7, 6, 5, 4, 3, 2, 1]
> b.sort.reverse
=> ["e", "d", "c", "b", "a"]
多重配列
1項目は降順、2項目は昇順の場合
> c.sort_by{|item| [-item[0], item[1]]}
=> [[3, "c"], [2, "a"], [2, "b"], [1, "a"]]

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。