如何以我想要的方式对这个数组进行排序?

时间:2012-11-06 06:30:57

标签: ruby

说我有这样的数组:

[["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出现的次数等等。所以基本上,我想循环遍历这个2D数组并为每个子元素的第一个元素循环,我想查看是否已经记录了这个字符串 - 如果我有,那么我增加记录的值,如果我没有,那么我为这个新字符串创建一个新条目。
  3. 这个特殊的数组相对简单,可以相对容易地在视觉上完成,但假设我将拥有一个包含数百/数千个元素的数组。

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

    我该如何处理?

2 个答案:

答案 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}