Вопрос о рубиновом массиве! - PullRequest
0 голосов
/ 21 июня 2010

Привет, ребята, у меня есть вопрос. Я хочу преобразовать массив. [[1, [-1, 1]], [1, [20, 8]], [1, [30, 4]], [1, [40, 2]], [1, [41, 6]], [1, [70, 243]]] в этот стиль [1,[[-1,1],[20,8],[30,4]...] или хэш [1 => ...] Как я могу сделать этот трюк? спасибо!

Ответы [ 3 ]

6 голосов
/ 21 июня 2010

Метод Dict:

array = [your array]
dict = {}
array.each{ |a| (dict[a[0]] ||= []) << a[1] }

Для ясности предложение Чака приведёт к следующему:

array = [your array]
dict = Hash.new {|h,k| h[k] = []}
array.each{ |a| dict[a[0]] << a[1] }

Затем вы можете получить массив из этого в стиле, который вы хотите, выполнив:

new_arr = dict.select{|k,v| [k, v]}

Что даст вам:

[[1, [[-1, 1], [20, 8], [30, 4], [40, 2], [41, 6], [70, 243]]]]

Обратите внимание на дополнительный массив, потому что если бы у вас были массивы, начинающиеся с 2, у вас был бы другой набор в конце. Так что new_arr[0] даст вам массив, который вы изначально искали.

2 голосов
/ 21 июня 2010

Если вы хотите это как Hash, это просто

h = Hash[ary.group_by(&:first).map {|k, v| [k, v.map(&:last)] }]

И если вы хотите это как Array, вы просто конвертируете Hash в Array:

a = *h
0 голосов
/ 21 июня 2010

Вы можете сделать это:

array = [[1, [-1, 1]], [1, [20, 8]], [1, [30, 4]],
         [1, [40, 2]], [1, [41, 6]], [1, [70, 243]]]

# map into hashes that can be merged together
hashes = array.map do |key,value|
  { key => [value] }
end

# fold all hashes into one hash by merging the values by key
merged_hash = hashes.inject({}) do |accu,value|
  accu.merge!(value) {|_,o,n| o|n }
end

Это можно записать не так просто: 1 1004 *

array.map{|k,v|{k=>[v]}}.inject({}){|a,v|a.merge!(v){|_,o,n|o|n}}
#==> {1=>[[-1, 1], [20, 8], [30, 4], [40, 2], [41, 6], [70, 243]]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...