您可能希望使用按选择排序的变体,每次从数组中找到其 '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
我建议阅读网络上有关按选择排序的一些资源。因为这是它的一个简单变体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