質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

3505閲覧

mapメソッドのソート

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/08/05 15:46

ruby on rails4,Hamlにて、ある配列をmapメソッドを使用して作成しています。

haml

1@list.map{ |a| [a.id, a.kana] } 2 3-#=>[[1,aiu],[2,aaa],[3,ueo]....]

この配列を、指定したidを優先的に先頭にしてソートするということは可能でしょうか。
SQLで表現すると以下のようなソートをしたいと思っています。

SQL

1select id,kana from a order by id = 2 desc; 2

haml

1-#=>[[2,aaa],[1,aiu],[3,ueo]....]

可能な場合どのように記述したらいいでしょうか。
色々調べてみたのですが、うまくいかず質問させていただきました。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Enumerable#sort_byを使えば、特殊なソートもできます。

ruby

1i = 0 2ary.sort_by {|v| [v[0] == 2 ? 0 : 1, i += 1] }

なお、iの制御は安定ソート(ソートする場所以外は元の順番を優先する)にするために入れてあるものです。

投稿2017/08/05 21:52

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/06 04:44

勉強になります。
退会済みユーザー

退会済みユーザー

2017/08/06 14:22 編集

ご回答ありがとうございます! すみません、初心者のため、ご回答いただいた内容で質問したいことがあります。 [v[0] == 2 ? 0 : 1, i += 1] この中の「 0 : 1」はどういう意味でしょうか。 v[0] == 2が真の場合0 v[0] == 2が偽の場合1 ということかと思いますが、この0と1は何の数値ですか? ご教示頂けますと幸いでございます。 よろしくお願いします。
maisumakun

2017/08/06 14:50 編集

順番指定のための値です。 v[0]==2のときが先に来てほしいので小さな0を、そうでないときは大きな1を指定してします(大小の区別ができればなんでも構いません)。
退会済みユーザー

退会済みユーザー

2017/08/07 12:23

ご回答ありがとうございます。 ご教示いただいた方法でうまくいきそうです!
guest

0

Ruby

1# encoding: utf-8 2 3arr = [[1, 'aiu'], [2, 'aaa'], [3, 'ueo']] 4 5def sort_test(arr, key) 6 a = Array.new(2).map{ [] } 7 arr.each { |e| (key == e[0] ? a[0] : a[1]) << e } 8 a[0].concat(a[1]) 9end 10 11p sort_test(arr, 2) 12# => [[2, "aaa"], [1, "aiu"], [3, "ueo"]] 13

Ruby

1# encoding: utf-8 2 3arr = [[1, 'aiu'], [2, 'aaa'], [3, 'ueo']] 4 5def sort_test(arr, keys) 6 key = [keys] 7 key.flatten! if keys.is_a?(Array) 8 a = Array.new(2).map{ [] } 9 arr.each do |e| 10 (key.include?(e[0]) ? a[0] : a[1]) << e 11 end 12 a[0].concat(a[1]) 13end 14 15p sort_test(arr, 2) 16# => [[2, "aaa"], [1, "aiu"], [3, "ueo"]] 17 18p sort_test(arr, [2, 3]) 19# => [[2, "aaa"], [3, "ueo"], [1, "aiu"]] 20

私はRuby初心者でRailsの事情は分かりません。
とんちんかんなことを言っていたらすみません。
優先的にsortしたい要素とそれ以外を別々の配列に
して優先的にsortしたい方の配列にそれ以外の配列
をくっつけて返すという方法はどうでしょうか。

投稿2017/08/05 16:11

編集2017/08/06 05:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/06 14:27

ご回答ありがとうございます。 最終形としてはご回答いただいたようなことをしたかったのです。 もう退会されていらっしゃるようなので、検索等で目を通すこともあるかと思いますので、 こちらでお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問