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

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

输入:[‘cars’,’for’,’potato’,’racs’,’four’,’scar’,’cream’,scream’]

输出:[[“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 

提前致谢,

像那样:

  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 

(另)