Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 首先对数组的特定项进行排序_Ruby On Rails_Ruby_Arrays_Sorting - Fatal编程技术网

Ruby on rails 首先对数组的特定项进行排序

Ruby on rails 首先对数组的特定项进行排序,ruby-on-rails,ruby,arrays,sorting,Ruby On Rails,Ruby,Arrays,Sorting,我有一个ruby数组,看起来像这样: my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb'] 我想对数组进行排序,使“chicken”和“beef”成为前两个项目,然后按字母顺序对其余项目进行排序。我该怎么做呢 irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] } #=> ["chicken", "be

我有一个ruby数组,看起来像这样:

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
我想对数组进行排序,使“chicken”和“beef”成为前两个项目,然后按字母顺序对其余项目进行排序。我该怎么做呢

irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] }
 #=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
这将为数组的每个元素创建一个排序键,然后按排序键对数组元素进行排序。由于排序键是一个数组,它会按位置进行比较,因此
[0,'chicken']<[1,'beef']<[2,'apple']<[2,'banana']

如果在运行时之前不知道要将哪些元素排序到前面,您仍然可以使用以下技巧:

 irb> promotables = [ 'chicken', 'beef' ]
  #=> [ 'chicken', 'beef' ]
 irb> my_array.sort_by { |e| [ promotables.index(e) || promotables.size, e ] }
  #=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
 irb> promotables = [ 'tofu', 'mushroom' ]
  #=> [ 'tofu', 'mushroom' ]
 irb> my_array.sort_by { |e| [ promotables.index(e) || promotables.size, e ] }
  #=> [ "tofu", "mushroom", "beef", "chicken", "fish", "lamb"]

如果只在运行时获取数据,我的方法更通用、更有用

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
starters = ['chicken', 'beef']
starters + (my_array.sort - starters)
# => ["chicken", "beef" "fish", "lamb", "mushroom", "tofu"]
可以

firsts = ["chicken", "beef"]
[*firsts, *(my_array.sort - firsts)]

#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]

如果“鸡肉”或“牛肉”在
my_array
中出现的次数多于(或少于)一次,那么其结果将不会是对
my_array
的重新排序。在撰写本文时,Rampion对Ruby 2.2.2的评论似乎不正确。