2016-08-29 7 views
1

Ich versuche herauszufinden, wie eine Zählung des häufigsten Elements in einem Array von ganzen Zahlen zu finden ist. Ich kann mir einige Methoden vorstellen, die hilfreich sein könnten, aber wenn ich einen Ausdruck innerhalb des Blocks schreibe, verstehe ich nicht mehr, wie man ein Element mit dem nächsten und vorherigen Element vergleicht. Irgendwelche Ideen? Alle Hilfe wird wirklich sehr geschätzt !!!ruby ​​arrays Anzahl der häufigsten Elemente

+0

Dass diese Frage ein Duplikat ist, ist kaum überraschend. Es ist jedoch nicht klar, um welche Frage es sich handelt. Mein Lesen der Frage ist, dass die maximale Anzahl zurückgegeben werden soll ("... wie finde ich eine Zählung des häufigsten Elements in einem Array ..."). (Siehe @ Tadmans Kommentar zu meiner Antwort.) Die Quelle von "Diese Frage hat hier bereits eine Antwort:" fragt nach dem Element, dessen Anzahl am größten ist. Zugegeben, es ist ein sehr kurzer Schritt von der Antwort zu dieser Frage bis zum Erhalten der maximalen Zählung, aber es kann bessere Wege geben, wenn nur die maximale Zählung gewünscht wird. –

Antwort

4

Ein einfaches war es, alle eindeutigen Werte zu bestimmen, jedes in seine Anzahl im Array zu konvertieren und dann die größte Anzahl zu bestimmen.

def max_count(arr) 
    arr.uniq.map { |n| arr.count(n) }.max 
end 

Zum Beispiel:

arr = [1,2,4,3,2,6,3,4,2] 
max_count(arr) 
    #=> 3 

Es gibt drei Stufen:

a = arr.uniq 
    #=> [1, 2, 4, 3, 6] 
b = a.map { |n| arr.count(n) } 
    #=> [1, 3, 2, 2, 1] 
b.max 
    #=> 3 

Eine etwas effizientere Art und Weise (weil die Elemente von arr nur einmal aufgezählt werden) ist eine Zählung zu verwenden Hash:

def max_count(arr) 
    arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.values.max 
end 

max_count(arr) 
    #=> 3 

Wir haben:

a = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 } 
    #=> {1=>1, 2=>3, 4=>2, 3=>2, 6=>1} 
b = a.values 
    #=> [1, 3, 2, 2, 1] 
b.max 
    #=> 3 

Siehe Hash::new für eine Erklärung der Hash.new(0). Kurz gesagt, wenn h = Hash.new(0) und h keinen Schlüssel k haben, gibt h[k] den Standardwert zurück, der hier Null ist. h[k] += 1 wird zu h[k] = h[k] + 1 erweitert. Wenn also h keinen Schlüssel k hat, wird h[k] = 0 + 1. Auf der anderen Seite, wenn, sagen wir, h[k] => 2, dann h[k] = h[k] + 1 #=> h[k] = 3 + 1.

+0

Vergiss nicht ['max_by'] (http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-max_by). – tadman

+0

@tadman, ich dachte 'max_by', aber es ist die maximale Anzahl, nicht das Element mit der maximalen Anzahl, das ist gewollt. Wenn ich 'max_by' verwendet hätte, müsste ich die Anzahl für dieses Element neu berechnen, was nicht ansprechend ist. –

+0

Das ist eine Interpretation der Frage, es ist wahr. Ich lese es auf die andere Art, das häufigste Element * basierend auf * zählen zu wollen. – tadman

Verwandte Themen