2011-12-03 6 views
248

में सरणी से डुप्लिकेट तत्वों को हटाएं मेरे पास रूबी सरणी है जिसमें डुप्लिकेट तत्व हैं।रूबी

array = [1,2,2,1,4,4,5,6,7,8,5,6] 

थोड़ी देर के लिए-लूप और यात्रा का उपयोग किए बिना सभी अद्वितीय तत्वों को बनाए रखना कैसे मैं इस सरणी से सभी डुप्लिकेट तत्वों को दूर कर सकते हैं?

उत्तर

574
array = array.uniq 

uniq method सभी डुप्लिकेट तत्वों दूर करता है और सरणी में सभी अद्वितीय तत्व बरकरार रखती है।

रूबी भाषा की कई सुंदरियों में से एक।

+73

या इस मामले में सिर्फ '' array.uniq जो जगह में काम करता है!। – cvshepherd

+38

नहीं, यूनिक! यदि सरणी अद्वितीय थी तो पूर्व: ए = [1,2,3,4] a.uniq -> [1,2,3,4] लेकिन a.uniq! -> शून्य – duykhoa

+12

मैं इसे वास्तव में रूबी भाषा की सुंदरता के रूप में नहीं देखूंगा ... यह सिर्फ रूबी मानक पुस्तकालय की सुंदरता है? मुझे गलत मत समझो, भाषा के बारे में बहुत सारी सुंदर चीजें हैं। –

41

आप uniq विधि के साथ डुप्लिकेट तत्वों को निकाल सकते हैं:

array.uniq # => [1, 2, 4, 5, 6, 7, 8] 

क्या यह भी जानते हैं के लिए उपयोगी हो सकता है कि uniq विधि एक ब्लॉक लगता है, इसलिए जैसे आप एक इस तरह चाबियों का एक सरणी है, तो है :

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"] 

और आप को पता है कि अद्वितीय फ़ाइलें हैं चाहते हैं, आप इसके साथ पता कर सकते हैं:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last } 
+5

मैं इससे थोड़ा उलझन में हूं। ब्लॉक का उपयोग तब किया जाता है जब आपको अपनी तुलनात्मक फ़ंक्शन की आवश्यकता होती है - आपके उदाहरण में, ब्लॉक के बिना उस सरणी में 'uniq' भेजना वही मान वापस लौटाएगा जैसा यह आपके ब्लॉक के साथ करता है। – hdgarrood

+0

@hdgarrood हाँ आप सही हैं, मैंने नोटिस नहीं किया; मेरा अद्यतन उत्तर – maprihoda

12

अगर कोई दोहराए गए मानों के सभी उदाहरणों को हटाने का तरीका ढूंढ रहा था, तो this question देखें।

a = [1, 2, 2, 3] 
counts = Hash.new(0) 
a.each { |v| counts[v] += 1 } 
p counts.select { |v, count| count == 1 }.keys # [1, 3] 
+0

देखें या बस 'ए = [1, 2, 2, 3] a.find_all {| x | a.count (x) == 1} # [1, 3] ' –

71

आप छेड़छाड़ भी वापस कर सकते हैं।

a = [1,1,2,3] 
a & a 

यह डुप्लीकेट भी हटा देगा।

+9

कार्यात्मक रूप से, यह उत्तर सही है, लेकिन मुझे लगता है कि यह यूनिक का उपयोग करने से काफी कम पठनीय है। –

+16

मैं इसे यहां डाल रहा था ताकि जो भी इस पृष्ठ पर जाता है, वह इसे करने के अन्य तरीकों को भी देखेगा, मैं यह कहने की कोशिश नहीं कर रहा था कि यह किसी भी तरह से बेहतर है। – jaredsmith

+3

कारण यह काम करता है क्योंकि सेट ऑपरेशंस का उपयोग करते समय, परिणामी सरणी को एक सेट के रूप में माना जाता है, जो एक डेटा संरचना है जिसमें आम तौर पर कोई दोहराना मूल्य नहीं होता है। 'ए | का उपयोग करना एक 'संघ) एक ही चाल करेगा। – Cezar

8

अगर कोई परवाह करता है तो बस एक और विकल्प।

आप एक सरणी के to_set विधि का भी उपयोग कर सकते हैं जो ऐरे को एक सेट में परिवर्तित करता है और परिभाषा के अनुसार, सेट तत्व अद्वितीय होते हैं।

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6] 
0

यह कई भिन्नताओं के साथ समस्या का एक बहुत ही सामान्य वर्ग है। आधार हालांकि वही रहता है। इनपुट सरणी में पूर्णांक होते हैं, जिनमें से कुछ डुप्लीकेट हो सकते हैं। हम उस सरणी में मौजूद सभी अद्वितीय संख्याओं को प्रिंट करना चाहते हैं।

Check the complete implementation here

0

रूबी में XOR ऑपरेटर के साथ प्रयास करें:

a = [3,2,3,2,3,5,6,7].sort! 

result = a.reject.with_index do |ele,index| 
    res = (a[index+1]^ele) 
    res == 0 
end 

print result