说我有这样的数组:
[["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"]]
我想做一些事情:
php
作为第二个元素的数组的数量 - 所以`[“bham”,“php”]将计为1。bham
出现在整个数组中的次数,以及auburn
出现的次数等等。所以基本上,我想循环遍历这个2D数组并为每个子元素的第一个元素循环,我想查看是否已经记录了这个字符串 - 如果我有,那么我增加记录的值,如果我没有,那么我为这个新字符串创建一个新条目。这个特殊的数组相对简单,可以相对容易地在视觉上完成,但假设我将拥有一个包含数百/数千个元素的数组。
也可以安全地假设每个子数组的两个元素总是一个单词 - 所以它应该相对容易跟踪。
我该如何处理?
答案 0 :(得分: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]]
答案 1 :(得分: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}