2017-09-28 11 views
0

大きなアレイの中にある複数のアナグラムを検出するのに役立つ人がいるかどうかは疑問でした。私はのようなものを使用して、基本的なチェックを行うことができることを知って複数のアナグラムの検出

x = "Red" 
y = "der" 

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

はしかし、私はそれよりも少し複雑な何か助けが必要。私が現在持っているのは、1万語以上の大規模な配列です。アレイを繰り返し処理し、すべてのアナグラムを別のリストに分けて返す最もクリーンな方法を探しています。

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

それは返す必要があります:

例えば、の配列があるふりをしましょう

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

彼らが配列で返されている必要はありません - 私はただの方法が必要ですそれらを分離する。

ありがとうございました!

答えて

3

代わりに、他のすべての単語に各単語を比較し、あなたが同じロジック使用group_by経由でグループのエントリを、次のことができます。

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

を使用して、別のアプローチを示唆しているステファンありがとう - これは完璧でした。 :) – IainK

+0

私は2017年にドイツ語を話している誰かから 'chars'を読むことを期待していませんでした:' puts ["äo"、 "öa"] group_by {| w | w.chars.sort} '#⇒' {["a"、 "o"、 "̈"] => ["äo"、 "öa"]} ' – mudasobwa

+0

@mudasobwa 'chars'は大丈夫です、あなたのNFD文字は全てをつまんでいます;-)クイックフィックス:' w.unicode_normalize.chars.sort' – Stefan

0

は、私は、ハッシュ

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

なぜこのアプローチを提案しますか?あなたは 'group_by'を再発明したようです。 –

+0

ちょっと別の意見だけど、それはコメントでなければならないかもしれない。答えではない。 – Anton

+0

'group_by'を再開発するだけでなく、この答えには深刻な設計上の欠陥があります。列挙可能性を減らすために' each'を悪用します。代わりに配列_.each_with_object(Hash.new {|ハッシュ、キー|ハッシュ[キー] = []}){...} 'でなければなりません。 – mudasobwa

関連する問題