【问题标题】:Sort by array of ids RUBY [closed]按 ID 数组排序 RUBY [关闭]
【发布时间】:2013-11-08 03:49:43
【问题描述】:

sort_by_this_array = [4,2,1,3]

&然后我有我的

[<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 个循环,这绝对不是最好的方法。

【问题讨论】:

  • 感谢您的回复。看起来它按 ASC-ing 顺序排序。 sort_by(&:goal_id)。我需要一点不同。我稍微编辑了我的问题,希望它变得更清楚。
  • sort_by_this_array = [4,2,1,3] 首先取所有goal_id = 4,然后goal_id = 2,goal_id = 1 & goal_id = 3

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


【解决方案1】:

不妨试试这种方法:

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

【讨论】:

  • 太棒了。非常感谢你的伙伴。它确实工作得很好。
【解决方案2】:

您可能希望使用按选择排序的变体,每次从数组中找到其 '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

【讨论】:

  • 非常感谢你,伙计。两个循环 :) 我也用两个循环做了,但是在 Igor Kasyanchuk 的回答之后我会...... :) 谢谢你们的帮助。
  • 您需要注意,使用a.sort_by {|e| [2, 3 , 1 , 4, 0].index(e.id) } 不会保留初始顺序,并且在某些情况下使用 sort_by 可能效率低下。有关更多信息,我建议在以下站点阅读信息:apidock.com/ruby/Enumerable/sort_by。有时一个衬里不是最佳选择(就性能而言),但这在很大程度上取决于您的用例。
  • 非常感谢您的帮助。
【解决方案3】:

你可以试试这个:

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

查看post

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2016-11-16
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2018-11-15
    • 2020-02-13
    相关资源
    最近更新 更多