19

私は持っている

a = ["a", "d", "c", "b", "b", "c", "c"]

次のようなものを出力する必要があります(出現回数の降順でソート):

c:3
b:2

最初の部分(一意ではないことを見つける)は次のとおりです。

b = a.select{ |e| a.count(e) > 1 }
=> ["c", "b", "b", "c", "c"] 

また

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

c
b

後方にソートされた出現数で各非一意を出力する方法は?

4

8 に答える 8

8

group_byメソッドはこれによく使用されます。

a.group_by{ |i| 私 }
{
    "a" => [
        [0]「あ」
    ]、
    "d" => [
        [0]「だ」
    ]、
    "c" => [
        [0] "c"、
        [1]「c」、
        [2]「ハ」
    ]、
    "b" => [
        [0] "b",
        [1]「ロ」
    ]
}

好き:

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
}

それらの1つがあなたのかゆみを掻くかもしれません。そこから、小さなテストを使用して結果を減らすことができます。

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}" }
あ:1
日:1
c:3
ロ:2
于 2013-03-08T00:02:32.730 に答える
1

どうですか:

a.sort.chunk{|x| a.count(x)}.sort.reverse.each do |n, v|
  puts "#{v[0]}:#{n}" if n > 1
end
于 2013-03-08T00:26:56.310 に答える
1

Enumerable#tallyRuby 2.7 から、番号付きのブロック引数を使用できます。

a = ["a", "d", "c", "b", "b", "c", "c"]
puts a.tally.filter { _2 > 1 }.sort_by { -_2 }.map &:first

ここでEnumerable#tallyは、 のようなハッシュを返します{ 'a' => 1, 'b' => 2, ... }。これをフィルタリングしてソートする必要があります。ソート後、ハッシュはネストされた配列に折りたたまれ[['b', 2], ...]ます。最後のステップは、 を使用して、各配列要素の最初の引数を取ること&:firstです。

于 2020-03-08T10:24:19.333 に答える
0
puts a.uniq.
     map { |e| a.count(e) > 1 ? [e, a.count(e)] : nil }.compact.
     sort { |a, b| b.last <=> a.last }
于 2013-03-08T00:06:18.187 に答える
0
a.reduce(Hash.new(0)) { |memo,x| memo[x] += 1; memo } # Frequency count.
  .select { |_,count| count > 1 } # Choose non-unique items.
  .sort_by { |x| -x[1] } # Sort by number of occurrences descending.
# => [["c", 3], ["b", 2]]

また:

a.group_by{|x|x}.map{|k,v|[k,v.size]}.select{|x|x[1]>1}.sort_by{|x|-x[1]}
# => [["c", 3], ["b", 2]]
于 2013-03-08T00:08:05.000 に答える