Сортировать определенные элементы массива в первую очередь - PullRequest
6 голосов
/ 12 мая 2010

У меня есть массив ruby, который выглядит примерно так:

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']

Я хочу отсортировать массив так, чтобы «курица» и «говядина» были первыми двумя элементами, а затем оставшиеся элементы были отсортированы по алфавиту. Как бы я поступил так?

Ответы [ 4 ]

11 голосов
/ 12 мая 2010
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"]
6 голосов
/ 12 мая 2010

Мой намного более общий и более полезный, если вы получаете ваши данные только во время выполнения.

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
starters = ['chicken', 'beef']
starters + (my_array.sort - starters)
# => ["chicken", "beef" "fish", "lamb", "mushroom", "tofu"]
1 голос
/ 01 ноября 2016

Могу просто сделать

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

#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
1 голос
/ 10 сентября 2013

Еще один способ решить эту проблему:

array = [1,2,2,3,3,4,5]
array.select {|element| element == 2} + array.select {|element| element != 2}
# => [2, 2, 1, 3, 3, 4, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...