我实现了一个分组字谜的功能。 简而言之:
输入:['汽车','换','土豆','racs','四','伤痕','奶油',尖叫']
输出:[[“cars”,“racs”,“scar”],[“four”],[“for”],[“potato”],[“cream”,“scream”]]
我想知道是否有更好的方法来做到这一点。
我真的认为我使用了太多的重复声明:until
,select
,
delete_if
。
有没有办法合并select
和delete_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
提前致谢,
答案 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
(未测试的)