0
votes

Fusionner des valeurs de hachage de rubis avec la même clé

est-ce possible pour atteindre avec des touches sélectionnées:

par exemple xxx

Sortie attendue xxx

mon essai xxx

donc, la sortie que je reçois est xxx

Mais, j'avais besoin xxx

note: Ceci est juste un tableau de test de hachage que j'ai pris pour poser ma question. Mais, le hachage réel a beaucoup de clés. Alors, s'il vous plaît ne répondez pas avec les réponses de comparaison clés

J'ai besoin d'une solution moins complexe


5 commentaires

Veuillez indiquer la question en mots, au début. La question n'est pas implicite d'un seul exemple. Vous ne souhaitez pas conserver la valeur de la clé : A dans h [1] ? H n'est pas le meilleur nom d'un tableau.


Si {A: 4, B: "Bonjour", c: "Test1"} Où existe-t-il, je suppose que la sortie doit être identique à celle qu'il est maintenant correct? Comme "Bonjour" existe déjà dans le groupement? À l'heure actuelle, cela n'est pas clair et non géré et aboutira à {A: 1, B: "Bonjour, hey, bonjour", c: "test1"} parce que uniq comparera "bonjour hey" à "bonjour"


@CarySwoveland Je comprends votre suggestion. Mais, c'est juste un moyen de mettre ma question. Le code actuel est énorme et a un grand nombre de clés dans le hachage


@Engineersmnky Je ne comprends pas ce que vous essayez de dire. Peut-être que ma question est peu claire. Mais vous pouvez essayer le code dans une console IRB . Je ne sais pas où vous obtiendriez une valeur comme "bonjour hey" sans ,


@Abhi Désolé pour la faute de frappe, mais la question reste encore que vous avez une vérification de l'unicité dans votre code susceptible d'échouer presque à chaque fois. Je m'inquiète de la production attendue si ce hachage supplémentaire existait


3 Réponses :


3
votes

Je ne peux pas voir une version plus simple de votre code. Pour que cela fonctionne complètement, vous pouvez utiliser le premier argument dans le bloc CODE> Fusionner CODE> au lieu de le renvoyer à la différenciation lorsque vous devez fusionner A code> et B code > ou lorsque vous utilisez simplement A code>. Votre ligne devient:

s.merge(l) { |key, a, b| key == :a ? a : [a, b].uniq.join(", ") }


0 commentaires

1
votes

Peut-être que vous pouvez considérer cette option, mais je ne sais pas s'il est moins complexe: xxx

La première partie regroupe les hachages par : C < / p> xxx

puis il mappe pour fusionner les premiers éléments avec d'autres personnes utilisant HASH # Fusionner


1 commentaires

La peine d'indiquer que {: a => 4,: b => "bonjour",: c => "test1"} entraînera {: A => 1,: b = > "Bonjour hey hello" ,: c => "test1"} parce que uniq comparera "bonjour hey" à "bonjour" < / code> donc peut-être h.group_by {| h | H [: C]} .Transform_Values ​​{| V | v.uniq {| H | H [: B]}} .values ​​....



1
votes
h.each_with_object({}) do |g,h|
  h.update(g[:c]=>g) { |_,o,n| o.merge(b: "#{o[:b]}, #{n[:b]}") }
end
  #=> { “Test1”=>{:a=>1, :b=>"Hello, Hey", :c=>"Test1"},
  #     “Test2=>{:a=>3, :b=>"Hi", :c=>"Test2"} }

0 commentaires