我有以下数组
[1, 2, 3, 4, 5, 1, 2, 5, 3, 4, 2, 3, 1, 3, 2, 2]`
我想找出两件事:
1)每个号码有多少重复?
例如: 1,3次, 4次,2次等。
2)在array
中找到3个最重复的数字。
例如:[2, 3, 1]
因为 2 重复 5次, 3 重复 4次& 1 重复 3次。
我试过了
arr = [1, 2, 3, 4, 5, 1, 2, 5, 3, 4, 2, 3, 1, 3, 2, 2]
= arr.group_by { |e| e }.map { |e| e[0] if e[1][1] }.compact
但结果不是我想要的:[1, 2, 3, 4, 5]
答案 0 :(得分:7)
▶ arr.group_by { |e| e } # arr.group_by(&:itself) for Ruby >= 2.2
.map { |k, v| [k, v.count] } #⇒ [[1, 3], [2, 5], [3, 4], [4, 2], [5, 2]]
.sort_by { |(_, cnt)| -cnt } #⇒ [[2, 5], [3, 4], [1, 3], [4, 2], [5, 2]]
.take(3) #⇒ [[2, 5], [3, 4], [1, 3]]
.map(&:first)
#⇒ [2, 3, 1]
删除最后三个子句以获得整个未排序的结果。
答案 1 :(得分:3)
要获得每份重复的重复条目数,您可以使用:
int greatestCommonDivisor(int a, int b)
{
if (b > a)
std::tie(a, b) = std::tuple{b, a};
while (b > 0)
std::tie(a, b) = std::tuple{b, a % b};
return a;
}
获得3个最重复的条目:
arr.group_by(&:itself)
.each_with_object({}) {|(k, v), hash| hash[k] = v.size }
#=> {1=>3, 2=>5, 3=>4, 4=>2, 5=>2}
答案 2 :(得分:0)
1)每个号码有多少重复?
counts = Hash[arr.uniq.map{|_x| [_x, arr.count(_x)]}]
=> {1=>3, 2=>5, 3=>4, 4=>2, 5=>2}
2)在数组中找到3个最重复的数字
counts.sort_by { |a, b| -b }.take(3).map(&:first)
=> [2, 3, 1]
答案 3 :(得分:0)
arr = [1, 2, 3, 4, 5, 1, 2, 5, 3, 4, 2, 3, 1, 3, 2, 2]
我建议使用计数哈希(请参阅&#34的引用;默认值"在Hash::new):
h = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
# => {1=>3, 2=>5, 3=>4, 4=>2, 5=>2}
并使用参数3
的{{3}}方法获取具有最大值的h
的三个键:
h.max_by(3, &:last).map(&:first)
#=> [2, 3, 1]
请注意,如果h
较大,则使用带有参数的max_by
比使用Enumerable#max_by或Enumerable#sort_by更有效,然后丢弃除三个最大值之外的所有值。已更改Enumerable
方法max_by
,min_by
max
和min
以允许Ruby v2.2中的参数(默认为1
)