嘿,夥計們,我有一個問題。我想轉換數組。 [[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 => ...] 我該怎麼辦這個伎倆?謝謝 !紅寶石陣列的問題!
回答
快譯通方法:
array = [your array]
dict = {}
array.each{ |a| (dict[a[0]] ||= []) << a[1] }
爲了清晰Chuck的建議是要把這個:
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]
會給你你最初尋找的陣列。
你可以這樣做:
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
這可以寫成一個不是那麼容易的一行:
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]]}
這似乎比馬特的解決方案更復雜,沒有任何好處。你爲什麼喜歡這種做法? – Chuck 2010-06-21 05:30:15
@Chuck它通過使用'inject'來解決問題,而不會污染局部變量名稱空間。我更喜歡|| = []的'merge'方法。當然這是一個品味問題。但我認爲Matt的解決方案也可以使用'inject'重寫,從而防止用臨時變量污染命名空間。 – hurikhan77 2010-06-21 07:45:46
如果你想把它當作一個Hash
,它只是
h = Hash[ary.group_by(&:first).map {|k, v| [k, v.map(&:last)] }]
如果你想要它作爲Array
,你只需將Hash
轉換爲一個Array
:
a = *h
+1爲一個非常優雅的解決方案,但我想提一下,group_by可能不適用於較舊的ruby API。 – hurikhan77 2010-06-21 11:58:40
我相信'.group_by'是ruby 1.9,儘管可能有rails選項。 – 2010-06-21 13:49:13
該代碼在Ruby 1.8.7及更新版本中未修改運行。要在Ruby 1.8.6中使用它,你必須要求''Enumerable#group_by'和'Symbol#to_proc'的backports。 – Chuck 2010-06-22 00:04:33
- 1. Nokogiri /紅寶石陣列問題
- 2. 紅寶石Twitter陣列問題
- 3. 紅寶石陣列,JavaScript和JSON問題
- 4. 紅寶石陣列
- 5. 陣列中的紅寶石
- 6. 陣列中的紅寶石
- 7. 訪問紅寶石矩陣
- 8. 紅寶石陣列範圍
- 9. 紅寶石陣列切片
- 10. 紅寶石陣列內部
- 11. 紅寶石陣列換行
- 12. 紅寶石發現陣列
- 13. 紅寶石陣列注入
- 14. 紅寶石陣列減法?
- 15. 兩個紅寶石陣列
- 16. 紅寶石:生成陣列
- 17. 紅寶石:從陣列
- 18. 紅寶石YAML陣列
- 19. 拼合紅寶石陣列
- 20. 紅寶石從陣列
- 21. 紅寶石嵌套陣列
- 22. 轉換陣列,紅寶石
- 23. 紅寶石:在陣列
- 24. 合併紅寶石陣列
- 25. 紅寶石 - 陣列弄平
- 26. 紅寶石陣列平等
- 27. 紅寶石陣列麻煩
- 28. 紅寶石陣列,[]操作
- 29. 紅寶石陣列打印
- 30. 紅寶石陣列值
你也可以很容易地派生出這樣的數組。創建散列,然後執行'hash.map {| key,values | [key,values]}'。另外,通過將哈希創建爲'Hash.new {[]}',您可以大大簡化您的'each' - 然後在每次迭代中不需要對'|| = []'進行操作,因爲不存在的鍵將返回一個空陣列。 – Chuck 2010-06-21 04:39:19
'Hash.new {[]}'只適用於像'+ ='這樣的賦值操作符,但是'''它不會。我相應地編輯了答案。 – 2010-06-22 00:57:23