-2

のようなものを渡すと、キーが一致する番号で、値がすべての一致のインデックスを含む配列で[1, 3, 4, 3, 0, 3, 1]あるハッシュを返すメソッドを使用して、Array クラスにモンキー パッチを適用しようとしています。{ 1 => [0, 6], 3 => [1, 3, 5] }

ここに私がこれまで持っているコードがあります。なぜ次のようなものを返すのかわかりません{1=>[0, 2, 3, 1, 2, 0], 3=>[0, 2, 3, 1, 2, 0], 0=>[0, 2, 3, 1, 2, 0]}

class Array

  def dups

    matches = {}
    matches_index = []

    self.each do |i|
      self[(i_index + 1)..-1].each_with_index do |j, j_index|
        matches_index << j_index if self[i] == self[j]
      end
      matches[i] = matches_index
    end

    matches.keep_if { |key, value| value.length > 1 }
  end

end
4

5 に答える 5

0

Stas S の優れたソリューションを改善するには:

class Array
  def dups
    (self.each_index.group_by {|i| self[i]}).keep_if{|k, v| v.size > 1}
  end
end

その結果、重複のみの配列になります。

于 2013-07-21T20:31:05.780 に答える
0

さらに別のバージョン:

class Array
  def dups
    to_enum
    .with_index
    .group_by(&:first)
    .select{|_, a| a.length > 1}
    .each_value{|a| a.map!(&:last)}
  end
end
于 2013-07-21T20:21:06.450 に答える
0
class Array

  def dups
    matches = {}
    self.each_with_index do |v, i|
      matches.has_key?(v) ? matches[v] << i  : matches[v] = [i]
    end
    matches
  end

end

x = [1, 3, 4, 3, 0, 3, 1]
puts x.dups
于 2013-07-21T20:08:55.303 に答える