【问题标题】:Ruby: Sort array of objects based on array of integersRuby:根据整数数组对对象数组进行排序
【发布时间】:2012-12-01 22:18:06
【问题描述】:

这看起来很简单,之前应该问过,但是我在 Stack Overflow 上找到的所有内容似乎都不起作用。我有一个包含 4 个对象的数组,我想按特定顺序重新排序。所以,它看起来像这样:

array = [Obj1, Obj2, Obj3, Obj4]

我有另一个整数数组,代表所需的索引顺序:

desired_order = [2,3,0,1]

所以我想在正确订购array 后看到的是:

array = [Obj3, Obj4, Obj1, Obj2]

我已经知道sort_by 是要使用的方法,但我似乎想不出正确的语法。非常感谢任何帮助!

【问题讨论】:

  • @theTinMan。似乎不是同一个问题,这里你已经有了索引。
  • 我不知道你的任务是什么,但看起来array.rotate.rotate 可以帮助在这种情况下。也许在其他情况下也是如此? :-P
  • 是的,在处理过时的 CMS 时,这是一个非常罕见的极端案例。我无法更改数据的输入方式,并且必须以特定顺序呈现。整个系统中只有这一特定项目的顺序错误... =\

标签: ruby arrays sorting


【解决方案1】:

Array#values_at 完全满足您的需求:

array.values_at(*desired_order)

【讨论】:

  • 知道如何将基准测试与map 进行比较吗?在这种情况下,因为我只有 4 项,所以没关系,但为了后代......
  • 为什么地图包含更多元素会更好?这是完全相同的操作,只是抽象已经存在于核心中(并且可能在 C 中实现)
  • 不是声称是,我是在问这个问题..不知道这是使用与 map 相同的操作。
  • 是的,我知道,问题是我不明白你为什么要问。想象一下,你有一百万个元素要检索,你还有一百万个元素的数组要映射,不是吗?所以在概念上没有区别。但是,由于映射是在 Ruby 级别完成的,而 values_at 在 C 级别完成,values_at 应该更快。您可以进行基准测试,但如果不是这样,我会感到非常惊讶。
  • 你能稍微编辑一下吗?看起来values_at 需要一个逗号分隔的整数列表,而我上面的问题中的desired_order 是一个整数数组,所以用我上面的代码编写会引发错误。
【解决方案2】:
desired_order.map{|i| array[i]}

【讨论】:

  • 啊哈!谢谢你们,毕竟 sort_by 不是正确的方法:)
  • 你也可以用sort_by来做,但不是那么简单:array.sort_by.with_index{|_, i| desired_order.index(i)}而且效率要低得多。
  • @Tokland 的values_at 更好。
【解决方案3】:

如果您已经有索引,那么您可以将它们映射到对象:

array = %w[obj1 obj2 obj3 obj4]
desired_order = [2,3,0,1]

desired_order.map{|idx| array[idx]} # => ["obj3", "obj4", "obj1", "obj2"]

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多