1

指定されたキー値に基づいてハッシュの配列を並べ替えようとしています。最初にその値を配列の上に返し、次に残りのデータを返します。

例は次のとおりです。

students = [{name: "John Doe", age: 16, adviser: "Mrs. Robinson"},
            {name: "John Smith", age: 18, adviser: "Mrs. Williams"},
            {name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"}]

def sort_by_adviser(data, name)
  ...
end

> sort_by_adviser(students, "Mr. Lee")
=> [{name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"},
    {name: "John Doe", age: 16, adviser: "Mrs. Robinson"},
    {name: "John Smith", age: 18, adviser: "Mrs. Williams"}]

> sort_by_adviser(students, "Mrs. Williams")
=> [{name: "John Smith", age: 18, adviser: "Mrs. Williams"},
    {name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"},
    {name: "John Doe", age: 16, adviser: "Mrs. Robinson"}]

ここで、出力はアドバイザーの名前をリストの一番上に表示し、その後に配列内の他のハッシュが続きます。

> sort_by_keyvalue(data, "Z")
=> [{letter: 'Z'},
    {letter: 'A'},
         .
         .
         .
    {letter: 'Y'}]

> sort_by_keyvalue(data, 5)
=> [{number: 5, value: 'value1'},
    {number: 5, value: 'value2'},
    {number: 5, value: 'value3'},
    {number: 9, value: 'value1'},
    {number: 9, value: 'value2'},
    {number: 8, value: 'value1'},
    {number: 8, value: 'value2'},
    {number: 7, value: 'value1'},
    {number: 6, value: 'value1'},
    {number: 4, value: 'value1'},
    {number: 3, value: 'value1'},
    {number: 2, value: 'value1'},
    {number: 1, value: 'value1'},
    {number: 1, value: 'value2'},
    {number: 0, value: 'value1'}]

誰もがそれを行う方法を知っていますか?

4

5 に答える 5

3

別の実装:)

def sort_by_adviser(data, name)
    data.each_with_index do |hash,index|
      if hash[:adviser]==name
         data.delete_at index #delete from array
         data.unshift hash
         break
      end
    end
   data
end

 > sort_by_adviser(students, "Mr. Lee")  
 #=> [{:name=>"Michael Rodriguez", :age=>17, :adviser=>"Mr. Lee"}, {:name=>"John Doe", :age=>16, :adviser=>"Mrs. Robinson"}, {:name=>"John Smith", :age=>18, :adviser=>"Mrs. Williams"}] 
于 2012-08-03T20:21:25.713 に答える
2
def creamy_sort(key, value, arr)
  top, bottom = arr.partition{|e| e[key] == value }
  top.concat(bottom.sort{|a,b| b[key] <=> a[key]})
end

creamy_sort(:adviser, "Mr. Lee", students)
于 2012-08-03T19:49:04.700 に答える
1

出来るよ:

def sort_by_adviser(data, name)
  data = data.sort{|x,y|x[:adviser] <=> y[:adviser]}
  i = data.index{|h|h[:adviser] = name}
  h = data.delete_at i
  data.unshift h
end
于 2012-08-03T19:47:04.990 に答える
1

私はこの解決策を持っています:

students = [{name: "John Doe", age: 16, adviser: "Mrs. Robinson"},
            {name: "John Smith", age: 18, adviser: "Mrs. Williams"},
            {name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"}]

def sort_by_adviser(data, *name)
  data.sort_by{| entry |    
    [ 
      name.index(entry[:adviser]) || 999,
      entry[:age], entry[:name] #2nd sort criteria
    ]
  }
end

p sort_by_adviser(students, "Mr. Lee")
#[{:name=>"Michael Rodriguez", :age=>17, :adviser=>"Mr. Lee"}, {:name=>"John Doe", :age=>16, :adviser=>"Mrs. Robinson"}, {:name=>"John Smith", :age=>18, :adviser=>"Mrs. Williams"}]

p sort_by_adviser(students, "Mrs. Williams")
# [{:name=>"John Smith", :age=>18, :adviser=>"Mrs. Williams"}, {:name=>"John Doe", :age=>16, :adviser=>"Mrs. Robinson"}, {:name=>"Michael Rodriguez", :age=>17, :adviser=>"Mr. Lee"}]

残りのエントリの並べ替えはどうなっているのかわかりませんでした。

あなたは書いた:それから残りのデータが先行する。ハッシュの順序基準は何ですか?

年齢、名前の順に選択しました。しかし、あなたはそれをあなたの必要性に適応させるかもしれません。

于 2012-08-03T19:52:08.137 に答える
1
def weird_sort(array, key, value)
  return array.sort_by{|d| 2 <=> (d[key] == value).object_id}
end

これは、ルビーにtrue.object_id等しいという事実に基づいています。2一種の奇妙な解決策であるため、それはweird_sort:pです。他の値の順序も混乱します...したがって、等しい値が上に来ることを保証するだけです!

于 2012-08-03T20:03:44.997 に答える