2017-09-07 119 views
-2

可以說我有如何將一個數組中的副本複製到另一個數組中?

array1=[1,2,1,1,5] 

我如何可以搜索任何重複,並把它們放到另一個數組,例如數組2,但前提是有超過3種?

我的目標是

array2=[1,1,1] 
+2

我建議先閱讀關於[Enumerable](https://ruby-doc.org/core-2.4.1/Enumerable.html)和[Array](https://ruby-doc.org/core)的文檔-2.4.1/Array.html)。他們擁有您需要的一切。 –

+0

你需要在這裏更具體。訂單是否需要保存?你是否也需要將它們從原始數組中刪除? – tadman

+0

沒有訂單或刪除只有重複存儲在另一個數組中的重複如果有3個以上重複 –

回答

2

使用選擇你可以在你的array1該元素存在3次或更多次,我在你的預期輸出中看到:

array1 = [1,2,1,1,5] 
array2 = array1.select { |e| array1.count(e) >= 3 } 
p array2 
# [1, 1, 1] 

如果存在沒有重複3次或更多次的元素,則array2將爲空。

2

我會做這樣的事情:

array1.group_by(&:itself).select { |_, v| v.size >= 3 }.values.flatten 
#=> [1,1,1] 
1

這保留訂單和具有O(n)的時間複雜度,n作爲數組的大小。

array1 = [3,2,1,3,2,1,1,5,2,1,3,3] 
array1 - array1.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }. 
       select { |_,cnt| cnt <= 3 }.keys 
    #=> [3, 1, 3, 1, 1, 1, 3, 3] 

步驟如下。

g = array1.each_with_object(Hash.new(0)) { |n,h| h[n]+= 1 } 
    #=> {3=>4, 2=>3, 1=>4, 5=>1} 
h = g.select { |_,cnt| cnt <= 3 } 
    #=> {2=>3, 5=>1} 
a = h.keys 
    #=> [2, 5] 
array1 - a 
    #=> [3, 1, 3, 1, 1, 1, 3, 3] 

Hash::new有默認值(這裏是零),通常被稱爲計數哈希。如果h = Hash.new(0)h沒有密鑰k,則h[k]返回默認值0

當紅寶石遇到表達h[k] += 1她做的第一件事就是它擴大到

h[k] = h[k] + 1 

如果h沒有密鑰k這成爲

h[k] = 0 + 1 

免收snytactic糖,前者表達讀

h.[]=(k, h.[](k) + 1) 

它是方法Hash#[]返回默認值,而不是方法Hash#[]=

相關問題