Ruby - Как выделить первую цифру каждого элемента в массиве? - PullRequest
0 голосов
/ 15 апреля 2019

у меня есть массив с числами, подобными этим:

list1 = [50, 2, 99, 1, 958, 9, 6, 80]

и мне нужно сравнить все элементы: цифра за цифрой. например, будет важно сравнить «9», «99» и «958», потому что мне нужно будет поставить «99» в конце, например:

list1 = [1, 2, 50, 6, 80, 9, 958, 99]

Есть ли в Ruby функция для этого? большое спасибо за вашу помощь:)

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Я думаю, что вы ищете это:

list1.sort_by(&:to_s)

Итак, это приведет к:

[50, 2, 99, 1, 958, 9, 6, 80].sort_by(&:to_s)
#=> [1, 2, 50, 6, 80, 9, 958, 99]

[50, 2, 1, 9].sort_by(&:to_s)
#=> [1, 2, 50, 9]

Если вы хотите обратный порядок, вы можете сделать:

[50, 2, 99, 1, 958, 9, 6, 80].sort_by(&:to_s).reverse
#=> [99, 958, 9, 80, 6, 50, 2, 1] 

[50, 2, 1, 9].sort_by(&:to_s).reverse
#=> [9, 50, 2, 1] 

И вы можете сделать. join, чтобы получить объединенную строку:

[50, 2, 1, 9].sort_by(&:to_s).reverse.join
#=> "95021"
2 голосов
/ 15 апреля 2019

Попробуйте: сравните значения, преобразованные в строку, используя String # <=> с Array # sort :

list1.sort { |a, b| a.to_s <=> b.to_s }
#=> [1, 2, 50, 6, 80, 9, 958, 99]

Если я понимаю вопрос, даже если первые три элемента вашего вывода сбивают меня с толку из-за логики.

0 голосов
/ 15 апреля 2019

Чтобы извлечь только первую цифру, вам просто нужно отобразить дважды:

list = [50, 2, 99, 1, 958, 9, 6, 80]

p list.map(&:to_s).map { |n| n[0] }
# => ["5", "2", "9", "1", "9", "9", "6", "8"]

Обновление: Решение, которое я связал ниже, является неверным . Проблема не так проста, как казалось.

Старый ответ следует:

...