Как коротко из алфавита вручную в Ruby? без сортировки или метода sort_by - PullRequest
0 голосов
/ 04 мая 2019

Как методы sort или sort_by работают в Ruby при сортировке буквенного массива? Как сделать это вручную без использования встроенного метода sort или sort_by?

пример:

irb(main):036:0> array = ['a','e','b','d','c']
=> ["a", "e", "b", "d", "c"]
irb(main):037:0> array.sort
=> ["a", "b", "c", "d", "e"]

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Если дублирующих элементов нет:

arr = ['a','e','b','d','c']

('a'..'z').to_a & arr
  #> ["a", "b", "c", "d", "e"]

Если дублирующих элементов может быть:

arr = ['a','e','c','b','d','e','c']

h = arr.each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }
  #=> {"a"=>1, "e"=>2, "c"=>2, "b"=>1, "d"=>1} 
(('a'..'z').to_a & arr).flat_map { |s| [s]*h[s] }
  #=> ["a", "b", "c", "c", "d", "e", "e"] 

Примечания:

  • Документ Array # & гласит: «Порядок сохраняется из исходного массива».
  • ('a'..'z').to_a & arr совпадает с ('a'..'z').to_a & arr.uniq.
0 голосов
/ 04 мая 2019

Может быть, вы могли бы написать свой собственный алгоритм?

def custom_sort(ary)
  start_ = []
  end_ = []
  loop do
    break if ary.size <= 1
    a, b = ary.min, ary.max
    start_ << ary.delete_at(ary.index(a))
    end_ << ary.delete_at(ary.index(b))
  end
  start_ << ary[0] unless ary.empty?
  start_ + end_.reverse
end

ary = ['a','e','b','d','c','a','a']
custom_sort(ary) #=> ["a", "a", "a", "b", "c", "d", "e"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...