Somme ruby valeurs de hachage
Je suis en train de la somme des valeurs d'un rubis de hachage, mais à l'aide soit d'injecter ou de réduire ne renvoie pas la bonne réponse. Il semble que ces méthodes sont en écrasant la valeur actuelle d'être stockée à la place de sommation.
Mon hash ressembler à ceci:
@test = [
{"total"=>18, "type"=>"buy", "date"=>Thu, 21 Nov 2013, "instrument_code"=>"food"},
{"total"=>92, "type"=>"buy", "date"=>Thu, 14 Nov 2013, "instrument_code"=>"food"},
{"total"=>12, "type"=>"buy", "date"=>Wed, 20 Nov 2013, "instrument_code"=>"drink"},
{"total"=>1, "type"=>"buy", "date"=>Mon, 11 Nov 2013, "instrument_code"=>"food"}
]
Voici mon injecter du code qui échoue:
def additions_per_security
@test.group_by { |i| i.type }.each do |key, value|
if key == "buy"
value.group_by{ |i| i.date }.each do |key, value|
@sortable_additions[key] = value
end
@sorted_additions = @sortable_additions.sort_by { |key,value| key }
@sorted_additions.shift
@additions_per_security = Hash[@sorted_additions.map { |key, value|
[key, value]
}]
@additions_per_security.each do |key, value|
value.group_by { |i| i.instrument_code }.each do |key, value|
@additions_security[key] = value.inject(0){ |result, transaction|
(result += transaction.total)
}
end
end
end
end
return @additions_security
end
Voici ma réduire code échec:
def additions_per_security
@@test.group_by { |i| i.type }.each do |key, value|
if key == "buy"
value.group_by { |i| i.date }.each do |key, value|
@sortable_additions[key] = value
end
@sorted_additions = @sortable_additions.sort_by { |key,value| key }
@sorted_additions.shift
@additions_per_security = Hash[@sorted_additions.map { |key, value|
[key, value]
}]
@additions_per_security.each do |key, value|
value.group_by { |i| i.instrument_code }.each do |key, value|
@additions_security[key] = value.map { |p| p.total }.reduce(0,:+)
end
end
end
end
return @additions_security
end
J'ai une table de hachage et je veux faire la somme des totaux pour toutes les touches à l'exception de la première date.
Je suis actuellement la suivante:
{"drink"=>12.0, "food"=>92}
Mon attendus résultat ressemblera à ceci:
{"drink"=>12.0, "food"=>110}
Merci d'avance pour tous les conseils.
votre testhash est foiré ou pas un hash; à réduire votre code que vous utilisez une variable de classe pour testhash. Le montant de la complexité de la méthode, c'est inquiétant, personne ne sera en mesure de vous dire pourquoi
La jordanie, votre premier problème, c'est que
Battez - vous avez raison, je manque le []. @testhash est une version simplifiée de la table de hachage je m'occupe. Ses juste montrer pertinentes de la valeur de la clé de paris pour cette question. Cary Le champ date est là parce que j'ai besoin de la somme de toutes les valeurs, sauf celles de la première date. J'ai mis à jour la table de hachage
Lire entre les lignes, il semble que votre référence à la "date de la première" doit être interprété comme "ne pas compter les valeurs de la table de hachage avoir la première valeur de
Oui, c'est correct. Je veux seulement les valeurs de toutes les dates après la première date à laquelle est pourquoi j'ai fait le group_by 'date', triés et éliminés (.maj) la première date
reduce
échoue. Je pense qu'avec un bon refactoring vous serez en mesure d'obtenir les bugs.La jordanie, votre premier problème, c'est que
@testhash
n'est pas une table de hachage. Si vous avez changé l'extérieur {}
à []
il serait un tableau de hachages; maintenant, il n'est pas un Rubis objet. Aussi, reduce
et inject
sont synonymes. Le mieux, pour simplifier, ainsi que résoudre, @testhash
, en supprimant les éléments de hachage. La date, en particulier, n'est pas pertinent, mais susceptible d'entraîner des complications.Battez - vous avez raison, je manque le []. @testhash est une version simplifiée de la table de hachage je m'occupe. Ses juste montrer pertinentes de la valeur de la clé de paris pour cette question. Cary Le champ date est là parce que j'ai besoin de la somme de toutes les valeurs, sauf celles de la première date. J'ai mis à jour la table de hachage
Lire entre les lignes, il semble que votre référence à la "date de la première" doit être interprété comme "ne pas compter les valeurs de la table de hachage avoir la première valeur de
date
(ici la dernière valeur de hachage dans @testhash)". Vous devez également supprimer 'hash' dans le nom de @testhash
. Merci de modifier à préciser.Oui, c'est correct. Je veux seulement les valeurs de toutes les dates après la première date à laquelle est pourquoi j'ai fait le group_by 'date', triés et éliminés (.maj) la première date
OriginalL'auteur JordanC | 2013-11-21
Vous devez vous connecter pour publier un commentaire.
J'offre les observations suivantes sur votre
inject
code:@
) serait suffisante;test.group_by {|i| i.type}...
devrait êtretest.group_by {|i| i["type"]}...
@sortable_additions[key]=value
devrait soulever une exception parce que le hachage n'a pas été créé;@sorted_additions.shift
supprime le premier élément de la table de hachage et renvoie cet élément, mais il n'y a pas de variable à recevoir (par exemple,,h = @sorted_additions.shift
);@additions_per_security = Hash[@sorted_additions.map { |key, value|[key, value]}]
semble convertir @sorted_additions à un tableau et puis de nouveau à la même hash.Ce qui suit est une façon de faire ce que vous voulez faire.
Tout d'abord, vous serez en passant les objets date. Travailler avec qui nous allons commencer par la fabrication de ces objets date pour les dates que vous avez dans votre exemple:
Pour les essais de:
Maintenant nous calculons ce que nous avons besoin.
ou nous pourrions avoir utilisé
Enumerable#select
:Noter qu'ici et ci-dessous, les valeurs de
date1
,date2
etdate3
sera affiché (par exemple,#<Date: 2013-11-21 ((2456618j,0s,0n),+0s,2299161j)>
sera affiché pourdate1
); j'ai utilisé les noms de variable ici comme des espaces réservés pour le rendre plus lisible. Aussi, tous les hachagesh
avech["date"] = earliest
sera rejetée (devrait-il y avoir plus d'un).J'ai utilisé un peu de variables temporaires, y compris
test_buy
,earliest
,all_but_last
,grouped
,keys
etarr
. Vous pouvez éliminer certains de ces par des "chaînage". Ici je vais vous montrer comment se débarrasser de certains d'entre eux:Vous pouvez penser que cela semble compliqué, mais une fois que vous acquérir de l'expérience avec Ruby, il aura un aspect très naturel et lire facilement. La mesure dans laquelle vous utilisez le chaînage est un style de préférence, cependant.
Je suis content que vous avez trouvé utile. Vous allez voir j'ai mis le champ "type" dans.
OriginalL'auteur Cary Swoveland
Si vous avez simple clé/valeur de hachage
{1 => 42, 2 => 42}.values.sum NoMethodError: undefined method
somme " pour [42, 42]:Array`{1 => 42, 2 => 30}.values.inject(:+)
OriginalL'auteur m4tm4t
Essayer:
OriginalL'auteur shweta