输入是单词数组 - 输出应该是对字符串进行分组的数组。

时间:2013-03-31 17:14:57

标签: ruby

我是新手,我不知道从哪里开始。

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)

我在数组中使用了sort方法,因为它是我发现的唯一一个让我传递数组的两个元素来进行比较的方法。非常感谢任何和所有的帮助!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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)

答案 2 :(得分:0)

如果您要将 所有可能的 字谜分组,您可能不希望一次只比较两个元素。你是否打算遗漏只有一个项目的字谜(例如'for',在你的例子中)?因此,您可能应该使用一个不同的函数,一次迭代每个元素。

<强>后的,事实

我认为@sawa有正确的想法。它结合了你想要实现的东西的正确性和Ruby的简洁性。