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

ale*_*sta 7 ruby ruby-on-rails anagram

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

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

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

我想知道是否有更好的方法来做到这一点.我真的觉得我用太多的重复语句:until,select, delete_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
Run Code Online (Sandbox Code Playgroud)

提前致谢,

Bor*_*jev 34

像那样:

 a = ['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream']
 a.group_by { |element| element.downcase.chars.sort }.values
Run Code Online (Sandbox Code Playgroud)

输出是:

[["cars", "racs", "scar"], ["for"], ["potatoes"], ["four"], ["creams", "scream"]]
Run Code Online (Sandbox Code Playgroud)

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

  • Ruby编程的规则#1:学习"Enumerable"的方法.规则#2:参见规则#1.:-) (6认同)