2015-07-14 2 views
-1

У меня есть два массива, которые нужно сравнивать и сортировать на основе другого массива. Вот так:Нужно сортировать массив на основе другого массива массива

a = [["A", 1075000], ["C", 1750000], ["D", 0], ["E", 0], ["B", 0]] 
b = ['A','B','C','D','E'] 

Массив a должны быть отсортированы в следующем порядке (в котором сравнивается с b):

[["A", 1075000], ["B", 0], ["C", 1750000], ["D", 0], ["E", 0]] 

Я попытался это:

sort_by a.sort! {|a1,b1| a1[0] <=> b1[0]} 
+0

да я использую sort_by a.sort! {| A1, b1 | a1 [0] <=> b1 [0]} , я что-то упустил – Ranzit

+0

, нужный результат останется таким же, если 'b = [B, A, C, D, E]'? – shivam

+0

@shivam: дает разные выходы на основе массива a значений, а вывод был прекрасным, если b = [B, A, C, D, E] – Ranzit

ответ

3

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

Тогда я хотел бы сделать что-то вроде этого:

a = [["A", 1075000], ["C", 1750000], ["D", 0], ["E", 0], ["B", 0]] 
b = ['A','B','C','D','E'] 

a.sort { |x, y| b.index(x.first) <=> b.index(y.first) } 
#=> [["A", 1075000], ["B", 0], ["C", 1750000], ["D", 0], ["E", 0]] 

В зависимости от размера b может иметь смысл использовать sort_by вместо sort. sort_by перехватывает возвращаемое значение блока и не оценивает блок несколько раз:

a.sort_by { |x| b.index(x) } 
+0

Работал как шарм !!!! – Ranzit

+0

+1, однако, я считаю, что быстрее будет строить хэш из 'b', потому что для большого' b' поиск хэшей будет быстрее, чем сканирование массива. Вы платите некоторую стоимость за обработку и скорость в производительности. – Candide

+0

Этот блок, присвоенный '.sort', используется n * log (n) раз. 'b.index' - O (n)'. Таким образом, производительность здесь будет плохо масштабироваться, так как 'a' и' b' станут большими. –

4

Другой способ сделать это:

lookup = {} 
b.each_with_index { |el, i| lookup[el] = i } 
a.sort_by { |el| lookup.fetch(el.first) } 
# => [["A", 1075000], ["B", 0], ["C", 1750000], ["D", 0], ["E", 0]] 
+0

этот тоже хорошо работаем. Tq bro – Ranzit

+2

также 'lookup = b.each_with_index.to_h' –