如何将Ruby中的数组排序为特定的顺序?

sgi*_*sgi 28 ruby arrays sorting

我想按照另一个数组中给出的特定顺序对数组进行排序.

EX:考虑一个数组

a=["one", "two", "three"]
b=["two", "one", "three"]
Run Code Online (Sandbox Code Playgroud)

现在我想按'b'的顺序对数组'a'进行排序,即

a.each do |t|
  # It should be in the order of 'b'
  puts t
end
Run Code Online (Sandbox Code Playgroud)

所以输出应该是

two
one 
three 
Run Code Online (Sandbox Code Playgroud)

有什么建议?

And*_*imm 51

数组#sort_by就是你所追求的.

a.sort_by do |element|
  b.index(element)
end
Run Code Online (Sandbox Code Playgroud)

响应评论的更具可扩展性的版本:

a=["one", "two", "three"]
b=["two", "one", "three"]

lookup = {}
b.each_with_index do |item, index|
  lookup[item] = index
end

a.sort_by do |item|
  lookup.fetch(item)
end
Run Code Online (Sandbox Code Playgroud)


Nak*_*lon 12

如果b包含所有元素a和if元素是唯一的,则:

puts b & a
Run Code Online (Sandbox Code Playgroud)


Chi*_*tan 10

假设a要按照元素的顺序进行排序b

sorted_a = 
a.sort do |e1, e2|
  b.index(e1) <=> b.index(e2)
end
Run Code Online (Sandbox Code Playgroud)

我通常使用它来按照ActiveRecord表单上字段的出现顺序对错误消息进行排序.

  • doc中的那个基准使用(no-op)块将`sort`没有块与`sort_by`进行比较.如果将`sort`与一个块(如本答案中的示例)与相应的`sort_by`版本进行比较,您将看到`sort_by`相当快. (4认同)
  • 我的基准测试显示`sort`为'N`秒,`sort_by`为0.07 N`秒,```为'0.01 N`. (2认同)
  • 因为在`sort_by`索引中,每个元素只计算一次,而在`sort`中,只有当它是一些缓存时才有可能.而```是用Ruby编译的. (2认同)