2016-12-16 49 views
1

排序多維數組紅寶石所以我有紅寶石的多維陣列,其看起來像這樣通過計數值

[["34224", "1"],["20561", "1"],["26195", "1"],["32098", "1"], 
["33375", "1"],["34077", "1"],["34219", "1"],["34220", "1"], 
["34223", "1"],["19178", "1"],["33650", "1"],["33654", "1"], 
["33715", "1"],["33716", "1"],["33966", "1"],["33967", "1"], 
["33968", "1"],["34068", "1"],["34069", "1"],["34070", "1"], 
["34071", "1"],["34072", "1"],["34073", "1"],["34074", "1"], 
["34075", "1"],["34076", "1"],["33515", "2"],["33717", "2"], 
["33852", "2"],["33965", "2"],["34222", "2"]] 

基本上,每個陣列中的第二個值是計數。

我想獲得數組中的所有值,其中count是1,count是2.我希望能夠將它們分開。

我該怎麼做THT在乾淨的紅寶石可能的方式

+0

沒有多在Ruby中使用二維數組(除非您從中計算「矩陣」標準庫),你所擁有的是一個數組,其元素是數組,但多維數組是一個完全不同的野獸。 –

+0

由於它被標記爲「ruby-on-rails」 - 數組是數據庫查詢的結果嗎?如果是這樣,請顯示查詢,也許數據庫可以更有效地處理分組。 – Stefan

回答

1

你不是在談論「排序」,你談論的是創建子集。以最簡單的方式,您可以使用數組的last方法獲取最後一個值。這裏是什麼樣子:

arr.select { |item| item.last == '1' } 
arr.select { |item| item.last == '2' } 
1

您應該使用group_by

array.group_by{|a| a.last} 
+1

我覺得'array.group_by(&:last)' - 看起來更漂亮:) –

0

如果你想第一組他們每個數組的第二個元素,然後基於第一個元素進行排序各組,你可以這樣做:

array = [["34224", "1"], ["20561", "1"], ["26195", "1"], ["32098", "1"], ["33375", "1"], ["34077", "1"], ["34219", "1"], ["34220", "1"], ["34223", "1"], ["19178", "1"], ["33650", "1"], ["33654", "1"], ["33715", "1"], ["33716", "1"], ["33966", "1"], ["33967", "1"], ["33968", "1"], ["34068", "1"], ["34069", "1"], ["34070", "1"], ["34071", "1"], ["34072", "1"], ["34073", "1"], ["34074", "1"], ["34075", "1"], ["34076", "1"], ["33515", "2"], ["33717", "2"], ["33852", "2"], ["33965", "2"], ["34222", "2"]] 
hash = array.group_by { |e| e[1] } 
hash.keys.each do |key| 
    hash[key] = hash[key].sort_by { |e| e[0].to_i } 
end 
hash # Final result 

這是基於假設你的第一個和第二個元素的數組將被表示爲字符串的數字。

0

使用group_bysortmap

ids_and_count = [ 
["34224", "1"],["20561", "1"],["26195", "1"],["32098", "1"], 
["33375", "1"],["34077", "1"],["34219", "1"],["34220", "1"], 
["34223", "1"],["19178", "1"],["33650", "1"],["33654", "1"], 
["33715", "1"],["33716", "1"],["33966", "1"],["33967", "1"], 
["33968", "1"],["34068", "1"],["34069", "1"],["34070", "1"], 
["34071", "1"],["34072", "1"],["34073", "1"],["34074", "1"], 
["34075", "1"],["34076", "1"],["33515", "2"],["33717", "2"], 
["33852", "2"],["33965", "2"],["34222", "2"]] 

ids_by_count = ids_and_count.group_by { |_, count| count }.map { |count, ids_and_count_by_count| 
    [ 
    count.to_i, 
    ids_and_count_by_count.map { |id, _| id.to_i }.sort 
    ] 
}.to_h 

ids_by_count現在是:

{ 
    1 => [ 
     19178, 
     20561, 
     26195, 
     32098, 
     33375, 
     33650, 
     33654, 
     33715, 
     33716, 
     33966, 
     33967, 
     33968, 
     34068, 
     34069, 
     34070, 
     34071, 
     34072, 
     34073, 
     34074, 
     34075, 
     34076, 
     34077, 
     34219, 
     34220, 
     34223, 
     34224 
    ], 
    2 => [ 
     33515, 
     33717, 
     33852, 
     33965, 
     34222 
    ] 
} 

如果你想所有出現兩次的ID:

ids_by_count[2] # => [33515, 33717, 33852, 33965, 34222]