2016-12-16 4 views
1

So habe ich ein mehrdimensionales Array in Ruby, die wie dieses im AllgemeinenSorting Multidimensional Arrays Ruby von Count Wert

[["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"]] 

sieht, wird der Zählwert der zweite Wert in jedem Array ist.

Ich möchte alle Werte im Array, wo die Anzahl 1 ist und wo die Anzahl 2 ist. Ich möchte in der Lage sein, sie zu sortieren.

Wie mache ich tht in den saubersten Rubin Weg möglich

+0

Es gibt keine multi- dimensionale Arrays in Ruby (es sei denn, Sie zählen 'Matrix' aus die Standardbibliothek), was Sie haben, ist ein Array, dessen Elemente Arrays sind, aber ein mehrdimensionales Array ist ein ganz anderes Biest. –

+0

Da dies mit "Ruby-on-Rails" markiert ist - ist das Array das Ergebnis einer Datenbankabfrage? Wenn ja, zeigen Sie bitte die Abfrage an, vielleicht kann die Datenbank die Gruppierung effizienter handhaben. – Stefan

Antwort

1

Sie sind nicht reden „Sortierung“, Sie sprechen über Untergruppen zu schaffen. In der einfachsten Weise können Sie die last-Methode eines Arrays verwenden, um den letzten Wert abzurufen. Hier ist, wie es aussieht:

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

sollten Sie group_by werden:

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

Ich denke 'array.group_by (&: last)' - sieht hübscher aus :) –

0

Wenn Sie erste Gruppe wollen, dass sie durch das zweite Element jedes Arrays und dann jede Gruppe sortieren basierend auf dem ersten Element, Sie können es wie folgt tun:

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 

diese auf der Annahme beruht, dass sowohl Ihre erste und das zweite Element des Arrays Anzahl als Zeichenfolgen dargestellt werden.

0

Mit group_by, sort und map:

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 ist jetzt:

{ 
    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 
    ] 
} 

Wenn Sie wollen, dass alle IDs, die doppelt erscheinen:

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