2017-09-28 5 views
0

Je me demandais si quelqu'un pouvait m'aider à détecter plusieurs anagrammes dans un grand tableau.Détection de plusieurs anagrammes

Je sais que je peux faire une vérification de base en utilisant quelque chose comme:

x = "Red" 
y = "der" 

x.downcase.split("").sort == y.downcase.split("").sort 

Cependant, je besoin d'aide pour quelque chose d'un peu plus complexe que cela. Ce que j'ai actuellement est un grand tableau contenant plus de 10 000 mots, et je cherche à trouver le moyen le plus propre de parcourir le tableau et de renvoyer tous les anagrammes séparés en différentes listes.

Par exemple, supposons le tableau est:

["Red", "Blue", "uLeB", "der"] 

Il devrait retourner:

[["Red", "der"], ["Blue", "uLeB"]] 

Ils ne doivent pas être retournés dans un tableau - j'ai besoin juste une façon de les séparant.

Merci d'avance pour toute aide!

Répondre

3

Au lieu de comparer chaque mot à tous les autres mots, vous pouvez regrouper les entrées via group_by, en utilisant la même logique:

words = %w(Red Blue uLeB der) 

words.group_by { |w| w.downcase.chars.sort } 
#=> { 
# ["d", "e", "r"]  => ["Red", "der"], 
# ["b", "e", "l", "u"] => ["Blue", "uLeB"] 
# } 
+0

Merci Stefan C'était parfait. :) – IainK

+0

Je ne m'attendais pas à lire 'chars' en 2017 de n'importe qui parlant allemand :)' puts ["äo", "öa"]. Group_by {| w | w.chars.sort} '# ⇒' {["a", "o", "̈"] => ["äo", "öa"]} '. – mudasobwa

+0

@mudasobwa 'chars' va bien, vos personnages NFD gâchent tout ;-) Correction rapide:' w.unicode_normalize.chars.sort' – Stefan

0

Je suggère une autre approche à l'aide Hash

h = Hash.new { |hash, key| hash[key] = [] } 
array = ["Red", "Blue", "uLeB", "der"] 
array.each {|e| h[e.downcase.split('').sort.join] << e } 

=> {"der"=>["Red", "der"], "belu"=>["Blue", "uLeB"]} 
+1

Pourquoi suggérez-vous cette approche? Il me semble que vous avez réinventé 'group_by'. –

+0

Juste une autre opinion, mais oui peut-être ce devrait être un commentaire .. pas une réponse. – Anton

+0

En plus de réinventer 'group_by', cette réponse a un sérieux défaut de conception: elle abuse de' each' pour réduire l'énumérable. Il devrait être 'array.each_with_object (Hash.new {| hash, key | hash [clé] = []}) {...}' à la place. – mudasobwa