8

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

输入:['cars','for','potatoes','racs','four','scar','creams',scream']

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

我想知道是否有更好的方法来做到这一点。我真的认为我使用了太多的重复语句:until, select, delete_if. 有没有办法结合selectanddelete_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

提前致谢,

4

2 回答 2

38

像那样:

 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"]]

如果你愿意,你当然可以把这个单线变成一种方法。

于 2012-03-10T14:05:48.243 回答
0

您可以使用在Enumerablepartition中实现的函数而不是 select 。它根据决策函数将数组中的条目拆分为两个数组。

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

(未经测试)

于 2012-03-10T14:02:44.593 回答