email_list = 10.times.map { emails }
#=> ["alfred.grass426@gmail.com", "elisa.oak239@icloud.com",
# "daniel.fruit1600@outlook.com", "ana.fruit3761@icloud.com",
# "daniel.grass742@yahoo.com", "elisa.oak3891@outlook.com",
# "alfred.leaf1321@gmail.com", "alfred.grass5295@outlook.com",
# "ramzes.fruit435@gmail.com", "ana.fruit4233@yahoo.com"]
email_list.group_by { |s| s[/@\K.+/] }.max_by { |_,v| v.size }.first
#=> "gmail.com"
\K
in the regex means disregard everything matched so far. Alternatively, @\K
could be replaced by the positive lookbehind (?<=@)
.
The steps are as follows.
h = email_list.group_by { |s| s[/@\K.+/] }
#=> {"gmail.com" =>["alfred.grass426@gmail.com", "alfred.leaf1321@gmail.com",
# "ramzes.fruit435@gmail.com"],
# "icloud.com" =>["elisa.oak239@icloud.com", "ana.fruit3761@icloud.com"],
# "outlook.com"=>["daniel.fruit1600@outlook.com", "elisa.oak3891@outlook.com",
# "alfred.grass5295@outlook.com"],
# "yahoo.com" =>["daniel.grass742@yahoo.com", "ana.fruit4233@yahoo.com"]}
a = h.max_by { |_,v| v.size }
#=> ["gmail.com", ["alfred.grass426@gmail.com", "alfred.leaf1321@gmail.com",
# "ramzes.fruit435@gmail.com"]]
a.first
#=> "gmail.com"
If, as here, there is a tie for most frequent, modify the code as follows to get all winners.
h = email_list.group_by { |s| s[/@\K.+/] }
# (same as above)
mx_size = h.map { |_,v| v.size }.max
#=> 3
h.select { |_,v| v.size == mx_size }.keys
#=> ["gmail.com", "outlook.com"]