4

如果我有书籍评分的哈希值,例如

books = {"Gravity's Rainbow"=>:splendid,
         "House in Hyde Park"=>:splendid, 
         "The Week"=>:quite_good
        }

我想计算特定值或评级的出现次数,这是如何完成的?

我试过books.values[:splendid].length了——但我想这个错误是因为它认为我想从“books.values”中把所有东西都切成“splendid”,这是错误的类型。

如何删除所有不是 ":splendid" 的内容books.values?我应该查看列表操作而不是哈希吗?我对 Ruby 完全陌生,一边打字一边思考。我不确定是否books.values返回了列表或其他类型?

4

2 回答 2

7

books.values返回一个数组:

books.values
#=> [:splendid, :splendid, :quite_good]

所以你可以使用Array#count

books.values.count(:splendid)
#=> 2

或类似的东西来计算所有值:

Hash[books.group_by { |k, v| v }.map { |k, v| [k, v.count] }]
#=> {:splendid=>2, :quite_good=>1}
于 2013-10-02T15:01:41.900 回答
4

使用 Enumerable 的#count 方法

books.values.count { |v| v == :splendid }

正如@Stefan 回答的那样,您也可以缩短它books.values.count(:splendid)

于 2013-10-02T15:00:49.497 回答