哈希和放置

时间:2015-05-23 17:51:55

标签: ruby hash puts

如何优雅地重新排列我的代码,以便我可以获得输出{: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个单音节:质量,放置,宠物。我和其他一些人发音" puts" "喜欢"放s"所以我想把它归类为多音节。如果我错了,请纠正我。

2 个答案:

答案 0 :(得分: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'是单音节的,并且在...中定义 哈希首先,所以哈希的输出反映了这一点。在第二 case,'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}

这会对哈希的数组形式进行排序,然后转换回哈希值。

答案 1 :(得分:-1)

def polysyllabic(dictionary)

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