Récupère les éléments n principaux du tableau ruby des valeurs de hachage
Hey j'ai un tableau où chaque élément est une table de hachage contenant quelques valeurs et un décompte.
result = [
{"count" => 3,"name" => "user1"},
{"count" => 10,"name" => "user2"},
{"count" => 10, "user3"},
{"count" => 2, "user4"}
]
Je peux trier le tableau par le comte comme suit:
result = result.sort_by do |r|
r["count"]
end
Maintenant, je veux être en mesure de récupérer les n premières entrées en fonction count (pas seulement le premier(n)) Est-il un moyen élégant pour ce faire?
Ainsi, à titre d'exemple, si n = 1 je en droit d'attendre d'un jeu de résultats.
[{"count" => 10,"name" => "user2"}, {"count" => 10, "user3"}]
depuis que j'ai posé pour toutes les entrées avec le score le plus élevé.. si j'ai demandé pour les 2 meilleurs scores les plus élevés que j'obtiendrais
[{"count" => 10,"name" => "user2"}, {"count" => 10, "user3"}, {"count" => 3, "user1"}]
source d'informationauteur Emmanuel P
Vous devez vous connecter pour publier un commentaire.
Énumérable#group_by
à la rescousse (comme d'habitude):La plupart du travail est fait par le
group_by
. Lesort_by
simplement des lignes les choses de sorte quepremière(2)
sera de ramasser les groupes que vous voulez. Puismap
avecdernier
va extraire le comte/nom de hachages que vous avez commencé avec, et la finaleaplatir l'
va nettoyer les restes d'un tableau.Cette solution n'est pas très élégant en termes d'être concis, mais il a un meilleur temps de la complexité.
En d'autres termes, il doit s'exécuter beaucoup plus rapide pour un très grand nombre de tables de hachage.
Vous aurez besoin d'installer le "les algorithmes" gem afin d'utiliser les données de Segment de mémoire de la structure:
Des tas sont une structure de données efficace lorsque vous avez besoin de trouver le plus grand ou le plus petit des éléments du groupe. Ce type de segment est optimale si la valeur de "n" est beaucoup plus petit que le nombre total de paires.
De départ en Ruby 2.2.0,
max_by
prend un argument supplémentaire qui vous permet de vous demander un certain nombre des meilleurs éléments au lieu de simplement obtenir une. Avec cela, nous pouvons améliorer mu est trop court's réponseLes documents ne disent pas si le tableau retourné par
max_by
est triée. Si cela s'avère être vrai que nous pourrions l'utiliserreverse
dans la dernière étape, plutôt que de les trier.