Ruby - сортировать многомерный массив по первой строке - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно отсортировать многомерный массив по первой строке.Первая строка (от массива [0] [0] до массива [0] [n-1]) состоит из строк, мне нужно отсортировать их, а остальные строки проследить ...

IЯ уже много искал и видел, как использовать функцию сортировки для сортировки по столбцам, но не нашел, как применить ее к моей проблеме ...
Я уже решил свою проблему с помощью пузырьковой сортировки, которая сортирует первуюзатем сообщите об изменениях в другие строки, если таковые имеются, но мне было интересно, есть ли лучший способ сделать это?

Создание массива: array = Array.new(4) { Array.new(var, 0) }

У меня есть кое-чтовот так:

[ [ "A 1", "A 3", "A 2", "A 4" ],
[ 4, 5, 6, 7 ],
[ 2, 2, 2, 2 ],
[ 0.1, 0.2, 0.1, 0.2 ] ]

Ожидаемый результат будет следующим:

[ [ "A 1", "A 2", "A 3", "A 4" ],
[ 4, 6, 5, 7 ],
[ 2, 2, 2, 2 ],
[ 0.1, 0.1, 0.2, 0.2 ] ]

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Меньше Ruby'ish подход:

sorted = arr.first.sort
# => ["A 1", "A 2", "A 3", "A 4"] 
order_arr = arr.first.map { |x| sorted.index(x) }
#  => [0, 2, 1, 3]
arr.map { |a| order_arr.map { |x| a[x] } }
# => [["A 1", "A 2", "A 3", "A 4"],
#     [4, 6, 5, 7],
#     [2, 2, 2, 2],
#     [0.1, 0.1, 0.2, 0.2]]
0 голосов
/ 06 февраля 2019

Вы можете использовать Array#transpose и Enumerable#sort_by для обработки этого следующим образом:

 arr = [ [ "A 1", "A 3", "A 2", "A 4" ],
         [ 4, 5, 6, 7 ],
         [ 2, 2, 2, 2 ],
         [ 0.1, 0.2, 0.1, 0.2 ] ]

Array#transpose превращает строки в столбцы:

arr.transpose
#=> [["A 1", 4, 2, 0.1],
#    ["A 3", 5, 2, 0.2],
#    ["A 2", 6, 2, 0.1],
#    ["A 4", 7, 2, 0.2]]

Тогда нам просто нужноотсортировать по значениям первого столбца sort_by(&:first):

arr.transpose.sort_by(&:first)
#=> [["A 1", 4, 2, 0.1],
#    ["A 2", 6, 2, 0.1],
#    ["A 3", 5, 2, 0.2],
#    ["A 4", 7, 2, 0.2]]

Затем мы просто transpose вернемся назад:

arr.transpose.sort_by(&:first).transpose
#=> [["A 1", "A 2", "A 3", "A 4"],
#    [4, 6, 5, 7],
#    [2, 2, 2, 2],
#    [0.1, 0.1, 0.2, 0.2]]

То же самое можно было бы достичь, сжав Array свот так: (но первое кажется лучшим выбором)

arr.reduce(&:zip).sort_by {|a| a.flatten!.first}.transpose
#=> [["A 1", "A 2", "A 3", "A 4"],
#    [4, 6, 5, 7],
#    [2, 2, 2, 2],
#    [0.1, 0.1, 0.2, 0.2]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...