2016-06-23 6 views
0

Есть два массива:Как сортировать один массив на основе другого массива, используя рубин

A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
B = [3, 4, 1, 5, 2, 6] 

Я хочу, чтобы отсортировать B таким образом, что для всех элементов B, которая существует в A, сортируем элементы порядок, который находится в массиве A.

Нужный отсортирован привело бы

B #=> [1, 2, 3, 4, 5, 6] 

Я попытался сделать

B = B.sort_by { |x| A.index } 

, но он не работает.

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

+0

_ "элементы B, которые существуют в массиве A" _ - что относительно элементов, которые не существуют в A? – Stefan

+0

Возможный дубликат [Сортировка массива в соответствии с элементами другого массива] (http://stackoverflow.com/questions/11961685/sort-an-array-according-to-the-elements-of-another-array) –

+0

Я разместил свой комментарий относительно возможного дубликата @WandMaker – ArkoD

ответ

6

Он прекрасно работает:

▶ A = [1,3,2,6,4,5,7,8,9,10] 
▶ B = [3,4,1,5,2,6] 
▶ B.sort_by &A.method(:index) 
#⇒ [1, 3, 2, 6, 4, 5] 

Если мог быть элементами в B, которые нет в A, используйте это:

▶ B.sort_by { |e| A.index(e) || Float::INFINITY } 
+0

Похоже, нет необходимости делать чек, который я сделал в своем ответе :) Хороший ответ. – radubogdan

+0

Хотя это не удается для элементов из B, которые не находятся в A. Попробуйте удалить элемент '3' из' A' – radubogdan

+0

Прекрасно работает! Спасибо – ArkoD

0

Я хотел бы начать с проверки того, что элементы из B существуют в A:

B & A 

, а затем разбирайтесь:

(B & A).sort_by { |e| A.index(e) } 
2

Я предположил, что каждый элемент B в A, что согласуется с примером, и необходимо для вопроса, чтобы быть хорошо определен.

Вы можете написать следующее.

A = [1,2,3,4,5,6,7,8,9,10] 
B = [3,6,1,5,1,2,1,6] 

(A&B).flat_map { |e| [e]*B.count(e) } 
    #=> [1,1,1,2,3,5,6,6] 

Если, кроме того, B не содержит дубликатов, это упрощает для

B = [3,1,5,2,6] 
A&B 
    #=> [1,2,3,5,6] 

Обратите внимание, что Array#& сохраняет порядок элементов A.

+0

Если каждый элемент 'B' находится в' A', это решение, безусловно, является самым элегантным. – mudasobwa