2017-05-12 3 views
-1

Ich habe dies:Wie kann dieses Array in Ruby neu angeordnet werden?

list = [[apple, John], [apple, Paul], [banana, Paul]] 

so sein:

list = [[apple, [John, Paul]], [banana, [Paul]] 

Ich weiß nicht, wie dieses Problem zu lösen, weil ich die Frequenz jedes Elements wissen müssen und neu ordnen sie nach die ganze Liste ...

+1

Ihre Datenstrukturen sind keine gültigen Ruby-Datenstrukturen. Was hast du auch versucht? [So] hilft Ihnen, Probleme mit dem Code zu lösen, den Sie schreiben, und nicht, um Ihren Code für Sie zu schreiben! Bitte geben Sie eine [mcve], Spezifikation der gewünschten Ein- und Ausgänge, einschließlich Eckfälle und Ausnahmen. Geben Sie Beispiele für gültige Eingaben und die gewünschten Ausgaben an, einschließlich derer, die die Eckfälle veranschaulichen. Vielleicht lies die [Hilfe/zum Thema], schau in [frag], nimm die [Tour] und schaue [meta] durch. –

+1

Möglicherweise möchten Sie einen Hash verwenden. –

Antwort

2
list.group_by(&:first).map { |fruit, preferences| [fruit, preferences.map(&:last)] } 
+0

Danke! Netter Code! –

1
list = [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]] 
=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]] 

Mit Enumberable#each_with_object, agg Regulieren aller Werte auf der Basis von Schlüssel in Hash und dann zurück in Array

list.each_with_object(Hash.new{[]}) { |x, h| h[x.first] <<= x.last }.to_a 
=> [["apple", ["John", "Paul"]], ["banana", ["Paul"]]] 
0

Ein weiterer Weg.

list = [%w|apple John|, %w|apple Paul|, %w|banana Paul|] 
    #=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]] 

list.each_with_object({}) { |(fruit,name),h| h.update(fruit=>[name]) { |_k,o,n| o+n } } 
    #=> {"apple"=>["John", "Paul"], "banana"=>["Paul"]} 

Dies nutzt die Form Hash#update (aka merge!), dass ein Block ({ |_k,o,n| o+n }) verwendet, die Werte des Schlüssels zu bestimmen, die in beiden fusionierten Hashes vorhanden sind. Definitionen für die drei Blockvariablen _k, o und n finden Sie im Dokument. Der Unterstrich weist den Leser darauf hin, dass _k (oft nur _ geschrieben) in der Blockberechnung nicht verwendet wird.

Verwandte Themen