Рубин: сортировка кроме одного элемента - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь отсортировать строковые элементы в массиве. Допустим, я хочу отсортировать его [b, e, f, t, g], но хочу сохранить e первым в ruby. Таким образом, результат должен быть [e, b, f, g, t]. Как я могу написать код в ruby, который сортирует массив таким образом.

Ответы [ 4 ]

3 голосов
/ 10 апреля 2019
["b", "e", "f", "t", "g"] .sort_by { |s| [s == 'e' ? 0 : 1, s] }
  #=> ["e", "b", "f", "g", "t"] 

Здесь Enumerable # sort_by использует Array # <=> для сравнения каждой пары элементов, вычисленных блоком, таких как [0, "e"] и [1, "b"]. См. Третий абзац документа для Array#<=>.

1 голос
/ 10 апреля 2019

Просто добавьте еще одну опцию, конвертируя в хэш:

ary = [:b, :e, :f, :t, :g, :e]
ary.sort.group_by(&:itself).then { |h| h.delete(:e) + h.values.flatten }

Возвращает массив, сохраняя все :e впереди.:e должно существовать.

#=> [:e, :e, :b, :f, :g, :t]

Первая часть возвращает отсортированный хэш группировки:

ary.sort.group_by(&:itself) #=> {:b=>[:b], :e=>[:e, :e], :f=>[:f], :g=>[:g], :t=>[:t]}


Чтобы метод работал даже при :eнет :
ary.sort.group_by(&:itself).then { |h| h.delete(:e).to_a + h.values.flatten }

С nil.to_a #=> []

1 голос
/ 10 апреля 2019

Вы можете разделить Array на все "е" и все не "е", а затем уменьшить их обратно вместе, как это

  arr = ["b", "e", "f", "t", "e","g"]
  arr.partition {|e| e == 'e'}.reduce {|e,not_e| e.concat(not_e.sort)}
  #=> ["e", "e", "b", "f", "g", "t"]    

Дополнительный кредит @ iGian для

  arr.sort.partition {|e| e == 'e'}.flatten
  #=> ["e", "e", "b", "f", "g", "t"]    
0 голосов
/ 10 апреля 2019

Вы можете попробовать это:

 arr.sort.reject{|x| x=="e"}.unshift('e')

Если в массиве больше, чем «e», он будет игнорировать все «e».

...