2

sort_by_this_array = [4,2,1,3] <-- これは属性 goal_id の配列です。

そして、私は私のものを持っています

[<Todo id: 12, goal_id: 2]>, <Todo id: 13, goal_id: 2>, <Todo id: 6, goal_id: 1>, <Todo id: 7, goal_id: 2 >, <Todo id: 25, goal_id: 3 >, <Todo id: 30, goal_id: 1 >, <Todo id: 40, goal_id: 4 >] 

結果は次のようになります: id: 40, 12,13,7, 6,30, 25

私は2つのループについて考えていますが、それは間違いなく最善の方法ではありません.

4

3 に答える 3

7

多分このアプローチを試してください:

S = Struct.new(:id, :v)
a = Array.new(5) { |i| S.new(i, i) }
a.shuffle!
a.sort_by {|e| [2, 3 , 1 , 4, 0].index(e.id) }

aID順にあなたを返します。

于 2013-11-08T07:01:20.567 に答える
1

'goal_id' 属性が配列の 'goal_id' と等しい 'todo' 要素を見つけるたびにスワップが発生する、選択による並べ替えのバリエーションを使用することができます。

Todo = Struct.new(:id, :goal_id)
todos = [Todo.new(12,2), Todo.new(13,2),Todo.new(6,1), Todo.new(7,2), Todo.new(25,3), Todo.new(30,1), Todo.new(40,4)]
sort_by_this_array = [4,2,1,3]

j = 0
sort_by_this_array.each do |goal_id|
  todos.each_with_index do |todo,i|
    if todo.goal_id == goal_id
      todos[i],todos[j] = todos[j],todos[i]
      j += 1
    end
  end
end

選択による並べ替えについて、Web 上のいくつかの情報源を読むことをお勧めします。これは単純なバリエーションであるため、http://www.sorting-algorithms.com/selection-sort

残念ながら、この解決策では、最初の todos 配列内の要素の順序は保持されません。スワップするたびに todo 要素が配置される位置が変更されるためです。したがって、それらはソートされますが、安定しません。

メモリを追加した安定したソリューション以下。

j = 0
results = []
sort_by_this_array.each do |goal_id|
  while idx = todos.index {|e| e.goal_id == goal_id}
    results << todos[idx]
    todos.delete_at(idx)
  end
end
于 2013-11-08T06:48:09.800 に答える
0

これを試すことができます:

Todo.all.sort_by{|e| e[:goal_id]}

この投稿をチェック

于 2013-11-21T12:25:20.803 に答える