Как вы поддерживаете индекс при сортировке двух индексированных синхронизированных (парных) массивов? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть два массива, которые мне нужны, чтобы соединить пары индексов:

arr1 = [17,9,8,20,14,16]
arr2 = [27,13,10,10,24,18]

Я хочу вернуть их оба как:

arr1 = [8,9,14,16,17,20]
arr2 = [10,13,24,18,27,10]

Я пробовал arr1.each.zip(arr2.each).sortчто дает мне: [[8, 10], [9, 13], [14, 24], [16, 18], [17, 27], [20, 10]].Я надеялся, что есть более быстрый способ, который также поддерживает массивы.

Затем я перешел к transpose, который дал мне мои вложенные массивы, но тогда я просто не могу заставить карту правильно исправить моиоригинальные массивы.

arr1.each.zip(arr2.each).sort.transpose.map {
 |a_1| a1.map { |a_2| arr1 = a_1; arr2 = a_2  }
}

Мне также кажется, что для этого должно быть более простое решение с меньшим временем и пространством.

1 Ответ

5 голосов
/ 20 апреля 2019

Ты очень близко.

arr1 = [17,9,8,20,14,16]
arr2 = [27,13,10,10,24,18]

arr1, arr2 = arr1.zip(arr2).sort.transpose
  #=> [[8, 9, 14, 16, 17, 20], [10, 13, 24, 18, 27, 10]] 
arr1
  #=> [8, 9, 14, 16, 17, 20] 
arr2
  #=> [10, 13, 24, 18, 27, 10] 

Обратите внимание, что если arr1 содержит дубликаты, соответствующие значения в arr2 разорвут связи при сортировке.

Другой способ, если вы хотите отсортировать только по arr1, следующий:

sorted_indices = arr1.each_index.sort_by { |i| arr1[i] }
  #=> [2, 1, 4, 5, 0, 3] 
arr1 = arr1.values_at(*sorted_indices)
  #=> [8, 9, 14, 16, 17, 20] 
arr2 = arr2.values_at(*sorted_indices)
  #=> [10, 13, 24, 18, 27, 10] 

См. Enumerable # sort_by и Array # values_at .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...