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

mar*_*ion 0 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"]]
Run Code Online (Sandbox Code Playgroud)

我想做一些事情:

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

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

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

我该如何处理?

pgu*_*rio 6

数量很简单:

a.count{|x| x[1] == 'php'}
#=> 24
Run Code Online (Sandbox Code Playgroud)

并且为了分组group_by:

a.group_by{|x| x[0]}.map{|k,v| [k,v.size]}
#=> [["bham", 2], ["auburn", 1], ["phoenix", 18], ["mobile", 1], ["tucson", 2]]
Run Code Online (Sandbox Code Playgroud)