【问题标题】:Hashes and puts哈希和放置
【发布时间】:2015-05-23 17:51:54
【问题描述】:

如何优雅地重新排列我的代码,以便获得输出 {:monosyllabic=>3, :polysyllabic=>4} 而不是相反?

def polysyllabic(dictionary)

  words = Hash.new(0)
  dictionary.each do |word|
  if word.scan(/[aeiou]/).size > 1
    words[:polysyllabic] += 1
  else
    words[:monosyllabic] +=1
  end
end

polysyllabic(%w(puts locker aero mass ana put pets))

编辑: 是的,我认为有 3 个单音节词:mass、put、pets。我和其他一些人发音“puts”“就像“put s”,所以我想把它归类为多音节。如果我错了,请纠正我。

【问题讨论】:

  • 单音节有4个:putsmassputpets,代码正确。 (例如您缺少end 并且您需要puts words 才能看到结果)
  • 如果问题是关于订单的,你不能在哈希中强制订单
  • 哈希应该被认为是无序的,尽管它们目前是按插入顺序排序的。而是按您想要的顺序检索键,并使用它们来访问它们各自的值。
  • 我认为问题是为什么:monosyllabic 的值是4,而不是3。究竟是什么问题?
  • @Dave,我很少对你提出异议,但我不同意“哈希应该被认为是无序的`”,因为我遇到过很多情况是维护插入顺序(v. 1.9+ ) 是以优雅的方式处理问题的关键。如果你是在散列上长大的,我希望你很难放手......

标签: ruby hash puts


【解决方案1】:

这是您的代码的清理版本:

def polysyllabic dictionary
  dictionary.each.with_object(Hash.new(0)) do |word, h|
    h[(word.count('aeiou') > 1) ? :polysyllabic : :monosyllabic] += 1
  end
end

Ruby 后期版本中的哈希保持键的顺序 添加到哈希中。

p polysyllabic(%w(puts locker aero mass ana put pets))
# => {:monosyllabic=>4, :polysyllabic=>3}
p polysyllabic(%w(locker aero mass ana put pets))
# => {:polysyllabic=>3, :monosyllabic=>3}

在第一种情况下,“puts”是单音节的,它在 首先散列,所以散列的输出反映了这一点。在第二 在这种情况下,'locker' 是 poly,所以首先输出。确保排序 输出,为该行为编写一个新方法。

class Hash
  def sorted_keys
    sort.to_h
  end
end

p polysyllabic(%w(locker aero mass ana put pets)).sorted_keys
# => {:monosyllabic=>3, :polysyllabic=>3}

这会对散列的数组形式进行排序,然后转换回散列。

【讨论】:

  • 怎么样,h[(word.count('aeiou') > 1) ? :polysyllabic : :monosyllabic)] +=1
  • 你可以写def sorted_keys; sort.to_h; end
【解决方案2】:
def polysyllabic(dictionary)

  words = {:monosyllabic=>0, :polysyllabic=>0}

【讨论】:

  • 你被电话叫走了吗?
猜你喜欢
  • 2019-04-04
  • 2015-12-26
  • 1970-01-01
  • 2013-03-21
  • 2021-02-05
  • 2018-02-24
  • 1970-01-01
  • 2020-02-20
  • 2011-02-03
相关资源
最近更新 更多