Переупорядочить массив Ruby на основе первого элемента каждого вложенного массива - PullRequest
2 голосов
/ 05 марта 2012

Моя цель - преобразовать a в b:

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)

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

1 Ответ

3 голосов
/ 05 марта 2012

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

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 # значения :

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

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

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

перечислимых # выравниваться

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

...