2012-03-05 6 views
2

Моя цель состоит в том, чтобы преобразовать в Ь:Reorder Рубин массив на основе первого элемента каждого вложенного массива

a = [["a","b"], ["d", "c"], ["a", "o"], ["d", "g"], ["c", "a"]] 
b = [[["a","b"], ["a", "o"]], ["c", "a"], [["d", "c"], ["d", "g"]] 

Они сгруппированы по первым элементом каждого вложенного массива. До сих пор у меня есть:

def letter_frequency(c) 
    d = Hash.new(0) 
    c.each do |v| 
    d[v] += 1 
    end 
    d.each do |k, v| 
    end 
    end 

def separate_arrays(arry) 
    arry2 = [] 
    arry3 = [] 
    big_arry = [] 
    y = 0 
while y < arry.length 
    arry2.push(arry[y][0]) 
    arry3.push(arry[y][1])   
    y += 1 
end 
    freq = letter_frequency(arry2) 
    front = arry.slice!(0..(freq["a"] - 1)) 
end 

separate_arrays(a) 

не только это, кажется излишним, но теперь есть гарантии, что «» будет законным Хеш ключ, так что последняя часть не работает. Спасибо за любую помощь.

ответ

3

Вы можете попробовать сделать что-то вроде этого:

a.group_by(&:first).values.map {|e| e.length > 1 ? e : e.flatten} 
# => [[["a", "b"], ["a", "o"]], [["d", "c"], ["d", "g"]], ["c", "a"]] 

Я использую следующие методы:

Enumerable#group_by (от первого элемента массива, как в вашем вопросе):

Возвращает хэш, ключи которого оцениваются в результате блока, а значения - это массивы элементов в перечислении, соответствующие ключу.

Hash#values:

Возвращает новый массив заполняется значениями из светлости. См. Также клавиши Hash #.

Enumerable#map (требуется потому, что вы не хотите, чтобы получить вложенный массив, когда есть только один матч, как и для c письма):

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

Enumerable#flatten:

Возвращает новый массив, который является одномерным уплощение этого массива (рекурсивно). То есть для каждого элемента, который является массивом, извлеките его элементы в новый массив. Если необязательный аргумент уровня определяет уровень рекурсии на сглаживание

+0

Отлично, спасибо. – EHNole

Смежные вопросы