如何根据订单快速重新排序Ruby数组?

10 ruby arrays

我有一个值数组,以及一个确定顺序的数组.

如何按给定顺序快速重新排列数组?

data = ['0','1','2','3','4','5']

order = [3,1,2,0,4,5]
Run Code Online (Sandbox Code Playgroud)

我想要:

data = ['3','1','2','0','4','5']
Run Code Online (Sandbox Code Playgroud)

Jak*_*mpl 23

您可以使用values_at为此类任务编写的方法:

data = ['0','1','2','3','4','5']
order = [3,1,2,0,4,5]

data.values_at *order
# => ["3", "1", "2", "0", "4", "5"] 
Run Code Online (Sandbox Code Playgroud)

  • @ user985823因为`values_at`不接受数组作为参数,而是接受任意数量的参数.`*`使`order`数组的每个值作为参数传递给方法. (4认同)
  • 很好又简短的答案!但我选择了其他解决方案,因为如果索引错误,它可能会引发异常。我希望我能将两个问题标记为正确 (2认同)

Til*_*ilo 9

data =  ["0", "1", "2", "3", "4", "5"]

order = [3, 1, 2, 0, 4, 5]

> order.map{|x| data[x]}
 => ["3", "1", "2", "0", "4", "5"]
Run Code Online (Sandbox Code Playgroud)

如果您不确定索引是否正确,您可以这样做:

> order.map{|x| data.fetch(x)}     # will raise an exception if index out of bounds
 => ["3", "1", "2", "0", "4", "5"]
Run Code Online (Sandbox Code Playgroud)

  • 我使用这种方法,因为它允许我使用`fetch`,如果它不起作用可以引发异常. (4认同)

Phr*_*ogz 5

不如@ Jakub的答案Array#values_at(我认为应该是接受的答案),但这里有一些其他有趣的选择:

p data.sort_by.with_index{ |d,i| order[i] }
p data.zip(order).sort_by(&:last).map(&:first)
Run Code Online (Sandbox Code Playgroud)