2013-03-31 55 views
1

我是一个新手,我不知道从哪里去。输入是单词阵列 - 输出应该是对阵列进行分组的数组阵列。

def combine_anagrams(words) 
    a1 = [] 
    words.sort do |x, y| 
     a = x.downcase.chars.sort.join 
     b = y.downcase.chars.sort.join 
     if a == b 
      a1.push(x,y) 
     end 
    end 
end 

x = ['cars', 'for', 'potatoes', 'racs', 'four', 'scar', 'creams', 'scream'] 
combine_anagrams(x) 

我使用的排序方法数组中,因为它是我发现它可以让我通过它的阵列来比较两个元素的唯一方法。任何和所有的帮助,非常感谢!

回答

2
x.group_by{|s| s.downcase.chars.sort}.values 
# => [["cars", "racs", "scar"], ["for"], ["potatoes"], ["four"], ["creams", "scream"]] 
+1

非常好!我认为他们都是成对的,并且错过了他们会有三倍或单打的可能性。 –

+0

这就是这样。我只提出一个变量的重命名:'x' - >'words','s' - >'word'。 – tokland

+0

这是伟大的sawa谢谢你!你能否详细说明在我的代码中替换的内容以及它的放置位置。我不断收到未定义的方法错误。 – ltrainpr

0

查阅关于combination的文档。 http://www.ruby-doc.org/core-2.0/Array.html#method-i-combination

尝试这样的事情(未经测试

def combine_anagrams(words) 
    a1 = [] 
    words.combination(2).each do |x, y| 
     a = x.downcase.chars.sort.join 
     b = y.downcase.chars.sort.join 
     if a == b 
      a1.push(x,y) 
     end 
    end 
end 

x = ['cars', 'for', 'potatoes', 'racs', 'four', 'scar', 'creams', 'scream'] 
combine_anagrams(x) 
0

如果你正在寻找所有可能字谜,你可能不希望只比较两个元素一次。你是否打算忽略只包含单个项目的字谜(例如,在你的例子中为'for')?因此,你可能应该使用一次迭代每个元素的不同函数。

后 - 事实上

@sawa看法是正确的,我想。它结合了你想要实现的正确性和Ruby的简洁性。