Ruby:基于整数数组对对象数组进行排序

Ruby:基于整数数组对对象数组进行排序,ruby,arrays,sorting,Ruby,Arrays,Sorting,这看起来相当简单,应该在之前询问过,但我在Stack Overflow上发现的一切似乎都不起作用。我有一个由4个对象组成的数组,我想按照特定的顺序对它重新排序。所以,看起来是这样的: array = [Obj1, Obj2, Obj3, Obj4] 我还有另一个整数数组,表示所需的索引顺序: desired_order = [2,3,0,1] 因此,在正确订购array之后,我希望看到的是: array = [Obj3, Obj4, Obj1, Obj2] 我已经想到了使用的方法是sort

这看起来相当简单,应该在之前询问过,但我在Stack Overflow上发现的一切似乎都不起作用。我有一个由4个对象组成的数组,我想按照特定的顺序对它重新排序。所以,看起来是这样的:

array = [Obj1, Obj2, Obj3, Obj4]
我还有另一个整数数组,表示所需的索引顺序:

desired_order = [2,3,0,1]
因此,在正确订购
array
之后,我希望看到的是:

array = [Obj3, Obj4, Obj1, Obj2]

我已经想到了使用的方法是
sort\u by
,但我似乎无法想出正确的语法。非常感谢您的帮助

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

desired_order.map{|i| array[i]}
array = %w[obj1 obj2 obj3 obj4]
desired_order = [2,3,0,1]

desired_order.map{|idx| array[idx]} # => ["obj3", "obj4", "obj1", "obj2"]
这正是您所需要的:

array.values_at(*desired_order)

啊哈!谢谢你们,猜测排序方式毕竟不是正确的方法:)你也可以用
sort\u by
来做,但它不是那么简单:
array.sort\u by.with_index{| | i |所需的_order.index(i)}
而且效率要低得多。@Tokland的
values\u at
更好。你知道这与
map
相比如何吗?在这种情况下,这并不重要,因为我只有4个项目,但为了子孙后代的利益…为什么地图上的元素越多越好?这是完全相同的操作,只是抽象已经存在于核心中(可能是用C实现的)并没有声称它是存在的,我在问这个问题..不知道这是使用与map相同的操作。是的,我知道,问题是我不明白你为什么要问。假设您有一百万个元素要检索,您仍然有一百万个元素的数组要映射,不是吗?所以在概念上没有区别。但是,由于映射是在Ruby级别完成的,而
values\u是在C级别完成的,因此
values\u应该更快。你可以做基准测试,但如果不是这样的话,我会非常惊讶。你能编辑一下吗?看起来,
values\u at
需要一个逗号分隔的整数列表,而在我上面的问题中,
required\u order
是一个整数数组,所以用我上面的代码写的,这会抛出一个错误。可能是@theTinMan的重复。看起来不是同样的问题,这里你已经有了索引。我不知道你的任务是什么,但它看起来像
array.rotate.rotate
在这种情况下可能会有所帮助。也许在其他情况下也会这样-是啊,这是一个极其罕见的边缘案件处理过时的CMS。我无法更改数据的输入方式,必须按特定顺序呈现数据。整个系统中只有这一项的顺序是错误的=\