1

次のような配列が与えられた場合

x = [1, 3, 5, -1, -3, -5]

コマンドを使用する場合

x.sort {|i| i}

私たちは与えられています

x = [-1, -3, -5, 1, 3, 5]

配列が与えられた場合、それを適切な昇順/降順で負の順序で返す方法はありますか? 例えば

x = [-5, -3, -1, 1, 3, 5] or [5, 3, 1, -1, -3, -5]

編集:

x.sort はこの問題を解決するように思えますが、ハッシュで指定された値に基づいて配列からソートしたいというより洗練された問題があった場合など

x = [{:i=>1}, {:i=>2}, {:i=>3}, {:i=>4}, {:i=>5}]
y = {3=>10, 4=>-1, 2=>-2, 5=>-3, 1=>-4}

結果が y の値に基づいて x をソートできるようにしたい

x = [{:i=>3}, {:i=>4}, {:i=>2}, {:i=>5}, {:i=>1}]
4

3 に答える 3

8
x = [1, 3, 5, -1, -3, -5]
x.sort # => [-5, -3, -1, 1, 3, 5]
x.sort {|a,b| a <=> b} # => [-5, -3, -1, 1, 3, 5]
x.sort {|a,b| b <=> a} # => [5, 3, 1, -1, -3, -5]

Array#sortmethodによって期待される戻り値のために、あなたの例は予期しない結果をもたらします。基本的に、最初の引数のみを返す場合 (2 つが予想される場合)、インタープリターは要素の符号 (-/0/+) のみを見て、それを順序付けに使用します。したがって、基礎となる並べ替えアルゴリズムに応じて、配列からブロックへのペアを生成するときに、最初の要素の符号のみを見ているため、次のようになります。

compare(1, 3) # => 1 (wrong, should be -1 since 1 < 3)
compare(1, 5) # => 1 (wrong, should be -1 since 1 < 5)
compare(1, -1) # => 1 (right, by complete accident)

[編集]更新された質問ごとに、次の並べ替えコンパレータ ブロックを使用してみてください。

x.sort! {|a,b| y[b[:i]] <=> y[a[:i]]}
x # => [{:i=>3}, {:i=>4}, {:i=>2}, {:i=>5}, {:i=>1}]

どの読み取り -x各要素のペアを比較することにより、配列をその場でaソートし、ハッシュでbそれらの属性を検索し、それらの値を降順で比較します。:iy

于 2012-04-06T21:56:12.630 に答える
2

これまでのところ、誰もEnumerable#sort_byについて言及していないことに驚いています。あなたの元の質問sortは明らかに正しい答えですsort_byが、あなたが期待したようにブロックでうまくいったでしょう。また、更新された質問は簡単に解決できます。

x = [-1, -3, -5, 1, 3, 5]
x.sort_by { |i| i } 
#=> [-5, -3, -1, 1, 3, 5]

x = [{:i=>1}, {:i=>2}, {:i=>3}, {:i=>4}, {:i=>5}]
y = {3=>10, 4=>-1, 2=>-2, 5=>-3, 1=>-4}
x.sort_by { |x| -y[x[:i]] } 
#=> [{:i=>3}, {:i=>4}, {:i=>2}, {:i=>5}, {:i=>1}]
于 2012-04-06T22:56:09.980 に答える
0
x.sort # => [-5, -3, -1, 1, 3, 5] 
于 2012-04-06T21:54:35.060 に答える