【问题标题】:Ruby way to group anagrams in string arrayRuby方法在字符串数组中分组字谜
【发布时间】:2012-03-27 16:01:22
【问题描述】:

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

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

输出:[["cars", "racs", "scar"], ["four"], ["for"], ["potatoes"],["creams", "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

提前致谢,

【问题讨论】:

标签: ruby-on-rails ruby anagram


【解决方案1】:

这样:

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

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

【讨论】:

  • Ruby 编程规则#1:学习Enumerable 的方法。规则#2:见规则#1。 :-)
  • 这在我的机器上工作很奇怪,但在 heroku 中却不行!当我在 heroku 上有这个时,我的网站就崩溃了......
  • 当我运行这个时,我只得到:
【解决方案2】:

您可以使用 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

(未经测试)

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2021-09-16
    • 2014-11-12
    • 2021-03-18
    • 2015-01-17
    • 2021-02-14
    • 2011-11-30
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多