在数组

时间:2016-11-16 11:33:47

标签: arrays ruby duplicates

我有以下数组

[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]

4 个答案:

答案 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_byEnumerable#sort_by更有效,然后丢弃除三个最大值之外的所有值。已更改Enumerable方法max_bymin_by maxmin以允许Ruby v2.2中的参数(默认为1