0

現在、私はこれを行っています:

(in initialize)
 @all = Stuff.all.each.map {|t| t.reference_date }
 @uniques = @all.uniq



results = []
@uniques.each do |k|
  i = 0
  @all.each do |x|
    i += 1 if x =~ %r{#{x}}
  end
  results << [k, i]
end

そして、それは大丈夫です。それはうまくいくでしょう。ただし、できる限り正規表現は避けたいと思います。彼らは少しフェオだと思います。それは醜いスペイン語です。

編集-実際には、ruby2012-03-31は日付オブジェクトが文字列内に配置されている場合のように(ここでは変数として)番号付きの形式で日付を「配置」するため、機能していませんが、実際には日付オブジェクトであるため、これは機能しました:

if x.month == k.month && x.day == k.day
  i += 1
end
4

5 に答える 5

2

あなたはたった1行でそれを行うことができます(もちろん私が正しければ):

array = %w(a b c d a b d f t z z w w)
# => ["a", "b", "c", "d", "a", "b", "d", "f", "t", "z", "z", "w", "w"]
array.uniq.map{|i|[i, array.count(i)]}
# => [["a", 2], ["b", 2], ["c", 1], ["d", 2], ["f", 1], ["t", 1], ["z", 2], ["w", 2]]
于 2012-11-02T21:02:01.530 に答える
1
results = Hash.new(0)
@all.each{|t| results[t] += 1}
# stop here if a hash is good enough.
# if you want a nested array:
results = results.to_a

これは、列挙可能な要素の頻度を取得するための標準的な方法です。

于 2012-11-02T21:06:16.370 に答える
1

正規表現の出現を回避するためにできることは、を使用してその場で正規表現を作成することRegexp.unionです。あなたがこれをしたいかもしれない理由はSPEEDです。適切に構築された正規表現は、リスト、特に大きなリストを反復処理するよりも高速です。また、コードで正規表現を作成できるようにすることで、醜い(feo)ものを維持する必要がなくなります。

たとえば、コードのさまざまなチャンクで私が行うことは次のとおりです。

words = %w[peer_address peer_port ssl ssl_protocol ssl_key_exchange ssl_cipher]
regex = /\b(?:#{ Regexp.union(words).source })\b/i
=> /\b(?:peer_address|peer_port|ssl|ssl_protocol|ssl_key_exchange|ssl_cipher)\b/i

そのため、正規表現を維持するのは簡単です。そして、それを使用してベンチマークを試して、反復に対してテキスト内のサブストリングを見つけてください。印象に残ります。

于 2012-11-02T21:33:28.340 に答える
0

ワイルドカードが機能する場合は、試してみてくださいFile.fnmatch

于 2012-11-02T20:47:36.533 に答える
0

あなたのコードから、それぞれの出現回数を取得したいと思いますreference_date。これは、物語全体を引き出してRubyで時間のかかる操作を実行する代わりに、ActiveRecordとSQLを直接使用することではるかに簡単に実現できます。

Rails 2.xを使用している場合は、次のようなものを使用できます。

Stuff.find(:all, :select => "reference_date, COUNT(*)", :group => "reference_date")

または、Rails 3を使用している場合は、次のように簡略化できます。

Stuff.count(:group => "reference_date")
于 2012-11-03T07:35:00.593 に答える