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. 2 番目の要素として持つ配列の数を数えます。つまりphp、`["bham", "php"] は 1 と数えます。
  2. リスト全体で最初の各要素が出現する回数を数えます。つまりbham、配列全体に何回出現するか、何回auburn出現するかなどです。したがって、基本的に、この2D配列を循環させ、各子の最初の要素について、すでにあるかどうかを確認したいと思いますこの文字列を記録しました - 記録されている場合は記録された値をインクリメントし、記録されていない場合はこの新しい文字列の新しいエントリを作成します。

この特定の配列は比較的単純で、視覚的に比較的簡単に実行できますが、数百/数千の要素を持つ配列があると仮定します。

また、各子配列の両方の要素が常に 1 つの単語であると想定しても安全です。そのため、比較的簡単に追跡できます。

どうすればこれにアプローチできますか?

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

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 に答える