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个循环&amp;这绝对不是最好的方式。
答案 0 :(得分:5)
也许尝试这种方法:
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) }
它会按ID顺序返回a
。
答案 1 :(得分: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
我会建议在网上阅读一些关于按选择排序的消息来源。因为这是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
答案 2 :(得分:0)