に、私はそれに重複とarray
を有し、所定の値n
場合:私は内複製の数を制限することができる方法制限数Rubyで与えられた値
array = [1,56,1,245,56,1,56,1,56,1,56]
n = 2
array
からn
までの残りの要素の位置を保持していますが、これを生成するには?カウントハッシュを使用して
array = [1,56,1,245,56]
に、私はそれに重複とarray
を有し、所定の値n
場合:私は内複製の数を制限することができる方法制限数Rubyで与えられた値
array = [1,56,1,245,56,1,56,1,56,1,56]
n = 2
array
からn
までの残りの要素の位置を保持していますが、これを生成するには?カウントハッシュを使用して
array = [1,56,1,245,56]
def ndup(list, n)
cnts = {}
list.select do |item|
cnts[item] ||= 0
cnts[item] += 1
cnts[item] <= n
end
end
ndup([1,56,1,245,56,1,56,1,56,1,56], 2)
#=> [1, 56, 1, 245, 56]
それは治療を働かせます。どうもありがとう! –
def ff(array, n)
occurances = Hash.new(0)
array.uniq do |element|
occurances[element] = occurances[element] < n ? occurances[element].next : n
[element, occurances[element]]
end
end
これは、これをテストする際に 'stack level too deep(SystemStackError)'を生成するようです。 –
@AlexanderSwann、私は自分の携帯からオリジナルを投稿しました。今修正されました。それでもなお、他の解決策が良いです。 – ndn
心配する必要はありませんが、ここではさまざまなソリューションを見るのは良いことです。修正してくれてありがとう:-) –
ここに行くための方法ですが、ここでの代替です:次のように
array.each_with_index.
group_by(&:first).
values.
flat_map { |a| a.first(n) }.
sort_by(&:last).
map(&:first)
#=> [1, 56, 1, 245, 56]
手順は次のとおりです。
enum = array.each_with_index
#=> #<Enumerator: [1, 56, 1, 245, 56, 1, 56, 1, 56, 1, 56]:each_with_index>
h = enum.group_by(&:first)
#=> { 1=>[[1, 0], [1, 2], [1, 5], [1, 7], [1, 9]],
# 56=>[[56, 1], [56, 4], [56, 6], [56, 8], [56, 10]],
# 245=>[[245, 3]]}
a = h.values
#=> [[[1, 0], [1, 2], [1, 5], [1, 7], [1, 9]],
# [[56, 1], [56, 4], [56, 6], [56, 8], [56, 10]],
# [[245, 3]]]
b = a.flat_map { |a| a.first(n) }
#=> [[1, 0], [1, 2], [56, 1], [56, 4], [245, 3]]
c = b.sort_by(&:last)
#=> [[1, 0], [56, 1], [1, 2], [245, 3], [56, 4]]
c.map(&:first)
#=> [1, 56, 1, 245, 56]
連続して重複がありますか? – fl00r
彼らは理想的な元の位置を保持することができます。したがって 'array = [1,56,1,245,56,1,56,1,56,1,56]'なら 'array = [1,56,1,245,56]'を返すことができれば理想的である。私はそのことを明確にするために質問を赤字にします。 –