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) }

它将a按 id 顺序返回您的。

于 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

我建议阅读网络上有关按选择排序的一些资源。因为这是它的一个简单变体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 回答