ruby:如何在数组中查找非唯一元素并使用出现次数打印每个元素?

ear*_*ter 16 ruby arrays

我有

a = ["a", "d", "c", "b", "b", "c", "c"]
Run Code Online (Sandbox Code Playgroud)

并且需要打印类似的东西(按出现次数降序排序):

c:3
b:2
Run Code Online (Sandbox Code Playgroud)

我理解第一部分(发现非独特)是:

b = a.select{ |e| a.count(e) > 1 }
=> ["c", "b", "b", "c", "c"] 
Run Code Online (Sandbox Code Playgroud)

要么

puts b.select{|e, c| [e, a.count(e)] }.uniq

c
b
Run Code Online (Sandbox Code Playgroud)

如何输出每个非唯一的向后排序的出现次数?

und*_*gor 22

puts a.uniq.
       map { | e | [a.count(e), e] }.
       select { | c, _ | c > 1 }.
       sort.reverse.
       map { | c, e | "#{e}:#{c}" }
Run Code Online (Sandbox Code Playgroud)

  • @RichardBrown:通常表示未使用的变量名. (3认同)
  • 我知道`_`也有[特殊用途](http://stackoverflow.com/questions/123494/whats-your-favourite-irb-trick/864710#864710),但在这个例子中,它被用作已分配但未使用的变量,以便抑制[警告ruby生成](http://stackoverflow.com/questions/9559561/where-and-how-is-the-underscore-variable-specified-in-ruby)在这个例子中,这两个选项都有同样的目的. (3认同)
  • 您还可以在未使用的变量名(如_temporary)之前使用下划线。它具有相同的目的,但更具描述性。 (2认同)

the*_*Man 7

group_by方法通常用于此:

a.group_by{ |i| i }
{
    "a" => [
        [0] "a"
    ],
    "d" => [
        [0] "d"
    ],
    "c" => [
        [0] "c",
        [1] "c",
        [2] "c"
    ],
    "b" => [
        [0] "b",
        [1] "b"
    ]
}

我喜欢:

a.group_by{ |i| i }.each_with_object({}) { |(k,v), h| h[k] = v.size }
{
    "a" => 1,
    "d" => 1,
    "c" => 3,
    "b" => 2
}

要么:

Hash[a.group_by{ |i| i }.map{ |k,v| [k, v.size] }]
{
    "a" => 1,
    "d" => 1,
    "c" => 3,
    "b" => 2
}

其中一个可能会刮伤你的痒.从那里你可以使用一点测试来减少结果:

Hash[a.group_by{ |i| i }.map{ |k,v| v.size > 1 && [k, v.size] }]
{
    "c" => 3,
    "b" => 2
}

如果您只想打印信息,请使用:

puts a.group_by{ |i| i }.map{ |k,v| "#{k}: #{v.size}" }
a: 1
d: 1
c: 3
b: 2