Ruby方式在字符串数组中分组anagrams

时间:2012-03-10 13:57:10

标签: ruby-on-rails ruby anagram

我实现了一个分组字谜的功能。 简而言之:

输入:['汽车','换','土豆','racs','四','伤痕','奶油',尖叫']

输出:[[“cars”,“racs”,“scar”],[“four”],[“for”],[“potato”],[“cream”,“scream”]]

我想知道是否有更好的方法来做到这一点。 我真的认为我使用了太多的重复声明:untilselectdelete_if。 有没有办法合并selectdelete_if声明?那 是否可以自动删除所选项目?

代码:

def group_anagrams(words)
  array = []
  until words.empty? 
    word = words.first
    array.push( words.select { |match| word.downcase.chars.sort.join.eql?(match.downcase.chars.sort.join ) } )
    words.delete_if { |match| word.downcase.chars.sort.join.eql?(match.downcase.chars.sort.join ) }
  end
  array
end

提前致谢,

2 个答案:

答案 0 :(得分:34)

就像那样:

 a = ['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream']
 a.group_by { |element| element.downcase.chars.sort }.values

输出是:

[["cars", "racs", "scar"], ["for"], ["potatoes"], ["four"], ["creams", "scream"]]

如果你愿意,你可以将这种单行程转变为一种方法。

答案 1 :(得分:0)

您可以使用partition功能代替select,在Enumerable中实现。它根据决策函数将数组中的条目拆分为两个数组。

def group_anagrams(words)
  array = []
  until words.empty? 
    word = words.first
    delta, words = words.partition { |match| word.downcase.chars.sort.join.eql?(match.downcase.chars.sort.join ) } )
    array += delta
  end
  array
end

(未测试的)