2012-03-05 185 views
2

我的目標是轉換到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) 

這不僅看起來矯枉過正,但現在有保證「一」將是一個合法的散列鍵,所以最後部分不工作。謝謝你的幫助。

回答

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

返回填充了來自HSH的值的新的數組。另請參閱哈希#鍵。

Enumerable#map(必需的,因爲你不想讓嵌套的數組時,有隻有一個匹配,像c字母):

返回與運行塊的結果的新陣列一次枚舉中的每個元素。

Enumerable#flatten

返回一個新數組,它是此陣列 (遞歸的)的一維變平。也就是說,對於數組中的每個元素,將其元素提取到新數組中。如果可選級別參數 確定遞歸級別變平

+0

完美,謝謝。 – EHNole 2012-03-05 10:38:41