2016-06-23 5 views
2

Ruby 1.8.7で単語の配列を狂ったルールでソートしようとしています。これは、大文字小文字を区別しないで並べ替えることができるように簡略化することができます。その後、2つの文字列が同じ場合に限り、大文字と小文字を区別します。if文に基づくRubyソート

私はあなたがちょうど.downcaseが同等である文字列を比較し、それらを並べ替えて、残りを0にすることができると思います。しかし、それは私のために働いていません。

は、ここで私が持っているものです。

["A", "a", "a.", "A.", "Ba", "ba"].sort_by{|a| a.downcase}.sort{|a,b| a.downcase==b.downcase ? a<=>b : 0 } 

所望の出力:あなたの助けを

["A", "a", "A.", "a.", "Ba", "ba"] 

感謝。

答えて

3

a.downcase == b.downcaseの場合は、大文字と小文字を区別した比較を使用して並べ替える必要があります。

array.sort_by { |s| [ s.downcase, s ] } 

と仮定sort_byは1つが最初に行くかを確認するために、2つの配列a1a2を比較している:それは本当にあなたがちょうど欲しいので、要素ごとに比較するRubyでペア[a.downcase, a]とアレイによってソートすることを意味します。それはちょうどa1 <=> a2コールです。 a1[0] != a2[0]の場合、宇宙船オペレータは、ネクタイがなく、<=>+1または-1をすぐに返すことができるので、ネクタイを破るために配列の2番目の要素を見る必要はありません。 a1[0] == a2[0]ならばa1[0] <=> a2[0]0であり、宇宙船はどのようにしてネクタイを壊すか(またはa1 == a2の場合はネクタイをそのまま残しておく)、2番目の要素を調べなければなりません。それはあなたが後にしている比較ロジックのように聞こえる。

+1

Rubyの配列は要素ごとに比較しますが、これについては[配列#<=>](http://ruby-doc.org/core-2.2)のドキュメントで詳しく説明しています。 0/Array.html#method-i-3C-3D-3E)。この一歩をさらに進めていくために、あなたが(OP)が 's'を最初にソートしたい場合は、' s'の長さを最長で最初にソートし、次に 's.downcase'と' s .size'を 's'で実行すると、配列' [s.downcase、-s.size、s]をソートすることができます。 –

+0

配列を複数の条件でソートすることは、これまで見たことのないアイデアです。これは非常に役に立ちます。 – lwassink

+0

これは質問に対する素晴らしい答えです。私が提出した質問に必要な答えが正確です。ありがとうございます。私は私が私の 'a.downcase == b.downcase'アプローチを修正しようとするためにこれを投稿したので、私は引き裂かれていると付け加えなければなりません。あなたの答えは私が仕事を終わらせるために必要な方法で、私は喜んであなたにチェックマークを与えます。残念ながら、この質問は、これらすべてに重複しているように感じるようです:https://www.google.com/#q=ruby+sort+by+mipleiple+site:stackoverflow.comそして、私は最終的にこれをマークする誰にも謝罪します重複としての質問 – paulguy

関連する問題