Сортировка по Ruby не делает то, что я ожидаю с подмассивами - PullRequest
0 голосов
/ 24 марта 2020

Я определяю метод, который должен принимать массив String, разбивать его на пары по 2 слова и сортировать их.

Однако сортировка работает не так, как я ожидаю. Он сортирует «s» перед «m» (для пары «my say» он ставит «say» перед «my»).

def sorted_pairs(array)
  puts "original: #{array}"
  new_array = array.each_slice(2).to_a
  puts "sliced: #{new_array}"
  new_array.sort #this line does nothing?
  puts "sorted: #{new_array}"
  return new_array
end

#test
words = %w(say my name say my name)
puts sorted_pairs(words)

expected: [["my", "say"], ["name", "say"], ["my", "name"]]
     got: [["say", "my"], ["name", "say"], ["my", "name"]]

sort! не будет работать, так как он будет сортировать пары в соответствии с элементом внутри каждой пары (не сортируя саму пару).

expected: [["my", "say"], ["name", "say"], ["my", "name"]]
     got: [["my", "name"], ["name", "say"], ["say", "my"]]

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Ваша проблема в том, что вы сортируете родительский массив, а не отдельные массивы внутри него. Попробуйте следующее:

def sorted_pairs(array)
  array.each_slice(2).map(&:sort)
end

sorted_pairs(words)
#  => [["my", "say"], ["name", "say"], ["my", "name"]]

Я удалил puts строки для ясности, хотя не стесняйтесь их сохранять, если хотите. Я также рефакторинг в один лайнер, так как это довольно просто читать таким образом.

Обратите внимание, что поскольку array.each_slice(2) возвращает Enumerator, он использует Enumerable#map, тогда как array.each_slice(2).to_a создает ненужный временный массив и использует Array#map.

Итак, что мы делаем проходит через каждую пару слов (в подмассиве) и вызывает sort для них, возвращая отсортированные значения (используя map).

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

1 голос
/ 24 марта 2020

Я предполагаю, что это то, что вы хотите:

new_array = array.each_slice(2).to_a
new_array.sort! {|a, b| a[0] <=> b[0]}

sort и sort! взять блок, который определяет, как сортировать. В этом случае мы хотим отсортировать по первому элементу массива. Оператор <=> используется для подобных случаев.


Я неправильно понял вопрос. Если мы хотим отсортировать внутренние массивы, мы можем просто map, используя sort, как @SRack ответил :

array.each_slice(2).map(&:sort)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...