2016-06-13 29 views
2

私は電子メールアドレスの配列(約50,000以上)を持っており、特定の電子メールドメインの頻度を数えたいと思っています。例えば、場合、私は 電子メール文字列を区切り文字で区切る

emails = [ 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]' 
] 

を持っていた私は、電子メールドメインが最も現れているに興味を持って、私は、周波数 2'gmail'を返すようにしたいでしょう。

これを行うには、アレイを通過して、@より前に発生したすべてのものを破棄し、ドメインを新しい配列として保持してから、それを繰り返すことをお勧めします。どうすればいい?

答えて

5

と仮定すると、あなたの電子メールは、あなたがこのような何かを行うことができ、stringです:

emails = ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"] 
counts = Hash.new(0) 
emails.each { |t| counts[t.partition("@").last] += 1} 
counts #{"gmail.com"=>2, "yahoo.com"=>1, "aol.com"=>1, "someuni.xyz.com"=>1} 
+2

「counts = emails.each_with_object(Hash.new(0)){| t、h | ...} ' – Stefan

+0

ありがとう!私が整数値に基づいて情報を並べ替えたいのであれば、どうすればいいですか?例えば、私が 'counts.sort'を使った場合(あなたが使ったのと同じカウント)、' [gmail.com、2]、[yahoo.com、1] ..のような出力が得られ、アルファベット順に並べられます。数値的に順序付けが必要です。言い換えれば、最も高い頻度の電子メールで注文します。 – Chumbawoo

+0

気にしないで、 'counts.sort_by {| a、b | b.to_i} ' – Chumbawoo

2
emails.map { |e| e.split('@').last } # leave domains 
     .group_by { |s| s }   # group 
     .map { |k, v| [k, v.count] } # count 
     .sort_by(&:last)    # sort 
     .last       # get results 
#⇒ ["gmail.com", 2] 
+2

期待される結果を提供する唯一の答え(「私は「周波数2のgmail」を返すことになります)がdownvotedになるのは面白いです:) – mudasobwa

2

が、私はそれが良いアイデアだと思った[...]ちょうど新しいようドメインを保ちます私はそれ以上の繰り返しが可能です。どうすればいい?

適切なライブラリを使用して、電子メールアドレスを解析する必要があります(例:Mail gem)。これは、アドレスフィールドへの容易なアクセスを提供するユーティリティクラスMail::Addressが付属しています:

require 'mail' 

emails = %w[ 
    [email protected] 
    [email protected] 
    [email protected] 
    [email protected] 
    [email protected] 
] 

domains = emails.map { |email| Mail::Address.new(email).domain } 
#=> ["gmail.com", "yahoo.com", "aol.com", "someuni.xyz.com", "gmail.com"] 

は、それはまた、より複雑なアドレス形式を処理することができます。 documentationから:

a = Address.new('Mikel Lindsaar (My email address) <[email protected]>') 
a.format  #=> 'Mikel Lindsaar <[email protected]> (My email address)' 
a.address  #=> '[email protected]' 
a.display_name #=> 'Mikel Lindsaar' 
a.local  #=> 'mikel' 
a.domain  #=> 'test.lindsaar.net' 
a.comments  #=> ['My email address'] 
a.to_s   #=> 'Mikel Lindsaar <[email protected]> (My email address)' 
3

mudasobwaの回答に似ています。

emails 
.group_by{|s| s.partition("@").last} 
.map{|k, v| [k, v.length]} 
.max_by(&:last) 
# => ["gmail.com", 2] 
関連する問題