'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