0

假设我有一个这样的数组:

[["bham", "php"],
 ["auburn", "php"],
 ["bham", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["mobile", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["tucson", "php"],
 ["tucson", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"]]

我想做几件事:

  1. 计算具有php作为第二个元素的数组的数量 - 所以 `["bham", "php"] 将计为 1。
  2. 计算每个第一个元素在整个列表中出现的次数。即bham在整个数组中出现了多少次,auburn出现了多少次,等等。所以基本上,我想循环通过这个二维数组,对于每个孩子的第一个元素,我想检查我是否已经记录这个字符串 - 如果我有然后我增加记录的值,如果我没有然后我为这个新字符串创建一个新条目。

这个特定的数组相对简单,可以在视觉上相对容易地完成,但假设我将有一个包含成百上千个元素的数组。

假设每个子数组的两个元素都将始终是一个单词也是安全的 - 所以它应该相对容易跟踪。

我该如何处理?

4

2 回答 2

6

计数很简单:

a.count{|x| x[1] == 'php'}
#=> 24

对于分组怎么样group_by:

a.group_by{|x| x[0]}.map{|k,v| [k,v.size]}
#=> [["bham", 2], ["auburn", 1], ["phoenix", 18], ["mobile", 1], ["tucson", 2]]
于 2012-11-06T06:41:40.747 回答
2

计算以 php 作为第二个元素的数组的数量

map只获取最后一个元素,然后select只获取我们关心的元素,并获取大小:

array.map(&:last).select { |s| s == 'php' }.size
#=> 24

计算每个第一个元素在整个列表中出现的次数

map只获取第一个元素,然后对其进行迭代,构建一个哈希来存储计数:

array.map(&:first).each_with_object(Hash.new(0)) { |s, h| h[s] += 1 }
#=> {"bham"=>2, "auburn"=>1, "phoenix"=>18, "mobile"=>1, "tucson"=>2}
于 2012-11-06T06:35:55.723 回答