按数组RUBY排序

时间:2013-11-08 03:49:44

标签: ruby-on-rails ruby ruby-on-rails-3

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;这绝对不是最好的方式。

3 个答案:

答案 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)

你可以试试这个:

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

选中此post