2

私はこのような配列を持っています:

array = ["john-56", "admin-57", "duke-58", "duke-65", 
         "john-56", "admin-57", "roger-65", "roger-15"]

複製された要素のみを保持したいのですが、この場合、次の結果が得られると予想されます。

["admin-57","admin-57","john-56","john-56"]

私はkeep_ifこのような方法を使用してみました:

array.keep_if { |x,y| x==y }

しかし、それはarray空のままです。

4

4 に答える 4

1

効率のために、最初にそれらをすべて数えてから、計算された数に基づいてそれらをフィルタリングします

array = %w[ john-56 admin-57 duke-58  duke-65
            john-56 admin-57 roger-65 roger-15 ]

begin
  counts = {}
  array.each { |name| counts[name] = counts[name].to_i + 1 }
  array.keep_if { |name| counts[name] > 1 }
end

p array

出力

["john-56", "admin-57", "john-56", "admin-57"]

または、フィルタリングされた要素を複数回表示したくない場合は、次のように記述します。

begin
  counts = {}
  array.each { |name| counts[name] = counts[name].to_i + 1 }
  array = counts.select { |k, v| v > 1 }.keys
end

p array

出力

["john-56", "admin-57"]
于 2013-08-08T11:38:18.937 に答える