Ruby方式在字符串数组中分组anagrams
我实现了一个分组字谜的function。 简而言之:
输入:[‘cars’,’for’,’potato’,’racs’,’four’,’scar’,’cream’,scream’]
输出:[[“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
提前致谢,
像那样:
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"]]
如果你愿意,你可以将这种单行程转变为一种方法。
您可以使用partition
函数而不是选择,在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
(另)