【问题标题】:How to group anagrams in a string into an array如何将字符串中的字谜分组到数组中
【发布时间】:2014-11-12 11:42:41
【问题描述】:

我想从给定的字符串中对 ruby​​ 中的字谜进行分组,结果应该是一个包含字谜组数组的数组,例如
给定字符串:“为四种疤痕霜尖叫汽车”
这里的汽车和疤痕是字谜(由相同的字符组成)
结果应该是 [[cars, Scar], ['for'], ['four'], ['creams', 'scream']]]

我试过这样,但它总是返回一个空哈希,我想从中提取值。

s = "scream cars for four scar creams"
anagrams_hash = Hash.new([])
words = s.split
words.each {|word| anagrams_hash[word.chars.sort.join] << word}

但 anagrams_hash 在运行我的代码后并没有改变,仍然是{}

【问题讨论】:

  • 返回数组,而不是哈希
  • @andreydeineko 这个问题涉及anagrams_hash,而不是这个sn-p的返回值,但你是对的,如果这是一个方法,那么anagrams_hash应该添加到结束。

标签: ruby arrays ruby-on-rails-4 hashmap


【解决方案1】:

如果你想按照自己的方式去做,那么 Stefan 是对的。但我不明白您代码中join 的用途。此外,您不必手动迭代哈希。还有一种更垃圾的方式。

"scream cars for four scar creams".split.group_by{|w| w.chars.sort}.values
#=> [["scream", "creams"], ["cars", "scar"], ["for"], ["four"]]

【讨论】:

  • 是的,您的解决方案简单明了,感谢您的建议。
【解决方案2】:

您必须使用块语法声明您的哈希:

anagrams_hash = Hash.new { |hash, key| hash[key] = [] }

【讨论】:

    【解决方案3】:

    问题是您没有将结果数组分配回anagrams_hash,即,您从哈希中获取数组,然后将单词附加到该数组,但从不将结果数组写回哈希.当哈希中不存在键并且您获得默认元素时,这会导致问题。修复将是,例如,

    words.each {|word| anagrams_hash[word.chars.sort.join] += [ word ] }
    

    【讨论】:

    • 感谢您的解释并帮助我解决了这个问题
    猜你喜欢
    • 2014-10-24
    • 2012-03-27
    • 2021-09-16
    • 2020-01-28
    • 2021-02-14
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多