0

次のハッシュ配列があるとします。

arr = [{:name=>"foo", :value=>20},
       {:name=>"bar", :value=>25}, 
       {:name=>"baz", :value=>30}] 

value現在、次のように並べ替えています。

arr.sort{|a,b| b[:value] <=> a[:value] }

別のメソッドをチェーンせずに、ソート後に要素 (つまり、 の要素name == 'bar') をスタックの一番上に移動することは可能ですか? 理想的には、これはソート ブロックでもう少しだけです。

4

3 に答える 3

2

高速なソリューション(リファクタリングできると思います)

arr.sort{|a,b| a[:name] == 'bar' ? -1 : b[:name] == 'bar' ? 1 : b[:value] <=> a[:value] }
# => [{:name=>"bar", :value=>25}, {:name=>"baz", :value=>30}, {:name=>"foo", :value=>20}] 
于 2012-12-02T13:33:36.607 に答える
0
arr.sort do |a,b|
  if a[:name] == "bar" && b[:name] != "bar"
    # a is bar but b is not, put a to the top, i.e. a is smaller than b
    -1
  elsif a[:name] != "bar" && b[:name] == "bar"
    # a is not bar but b is, put b to the top, i.e. a is bigger than b
    1
  else
    # both a and b are "bar", or bot are not "bar", than we can sort them normally
    a[:value] <=> b[:value]
  end
end

汚い解決策、より良い書き方を考えている...

于 2012-12-02T13:36:10.293 に答える