2016-03-31 14 views
0

に、私はそれに重複と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] 
+0

連続して重複がありますか? – fl00r

+0

彼らは理想的な元の位置を保持することができます。したがって 'array = [1,56,1,245,56,1,56,1,56,1,56]'なら 'array = [1,56,1,245,56]'を返すことができれば理想的である。私はそのことを明確にするために質問を赤字にします。 –

答えて

4
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] 
+0

それは治療を働かせます。どうもありがとう! –

1
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 
+0

これは、これをテストする際に 'stack level too deep(SystemStackError)'を生成するようです。 –

+0

@AlexanderSwann、私は自分の携帯からオリジナルを投稿しました。今修正されました。それでもなお、他の解決策が良いです。 – ndn

+0

心配する必要はありませんが、ここではさまざまなソリューションを見るのは良いことです。修正してくれてありがとう:-) –

1

ここに行くための方法ですが、ここでの代替です:次のように

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] 
関連する問題