2011-04-04 19 views
5

सूची तत्वों के निरंतर डुप्लिकेट को खत्म करने का सबसे अच्छा समाधान क्या है?सूची तत्वों के लगातार डुप्लीकेट हटाएं

list = compress(['a','a','a','a','b','c','c','a','a','d','e','e','e','e']). 
p list # => # ['a','b','c','a','d','e'] 

मैं इस एक है: (बशर्ते कि प्रत्येक तत्व एक भी चरित्र है)

def compress(list) 
    list.map.with_index do |element, index| 
    element unless element.equal? list[index+1] 
    end.compact 
end 

रूबी 1.9.2

+0

जैसा कि आपके पास कोई कामकाजी उत्तर है, 'सर्वश्रेष्ठ' के लिए आपके मानदंड क्या हैं? सबसे तेजी से? कम से कम? एक नए उपयोगकर्ता के लिए सबसे अधिक पठनीय? कम स्मृति? Trickiest? – Phrogz

+1

ध्यान दें कि यह है ** नहीं ** की _ [ "सरणी तत्वों है कि बार-बार कर रहे हैं से निकालें"] (डुप्लिकेट http://stackoverflow.com/questions/5444269/remove-from-the-array-elements-that -बार-बार-बार) _ (लेकिन यह यहां एक लिंक शामिल करने के लिए पर्याप्त है)। – Phrogz

+1

रूबी संस्करण क्या है? – fl00r

उत्तर

20

अच्छा अवसर इस बदसूरत संरचना के साथ यह ठीक कर सकते हैं (जब तक अपनी सूची nil शामिल नहीं है):

list.chunk{|x| x}.map(&:first) 

बड़े रूबी पर , आप इसका शुद्ध रूबी संस्करण प्राप्त करने के लिए require "backports/1.9.2/enumerable/chunk" कर सकते हैं।

+1

यह आश्चर्यजनक है! Enumerable # हिस्सा शुरू करने के लिए धन्यवाद –

+0

वास्तव में छोटे और शांत :) – fl00r

+2

एक दिन मैं अपने आलसी गधा उतरना और के लिए एक REP बारे में विली 'पहचान = -> एक्स {x}' कोर लाइब्रेरी में शामिल किया जाना है। –

4

ऐसा करें

list.join.squeeze.split('') 
1
# Requires Ruby 1.8.7+ due to Object#tap 
def compress(items) 
    last = nil 
    [].tap do |result| 
    items.each{ |o| result << o unless last==o; last=o } 
    end 
end 
list = compress(%w[ a a a a b c c a a d e e e e ]) 
p list 
#=> ["a", "b", "c", "a", "d", "e"] 
+0

की नकल यह केवल जवाब मैं –

3

रूबी 1.9+

list.select.with_index{|e,i| e != list[i+1]} 

@sawa के संबंध में, जो मुझे बताया था के साथ के बारे में with_index :)

के रूप में @ मार्क-आंद्रे Lafortune देखा है, अगर वहाँ अपनी सूची के अंत में यह आप के लिए काम नहीं करेगा पर nil। हम Enumerable#chunk, रूबी 1.9.2 में पेश उपयोग करने के लिए

list.select.with_index{|e,i| i < (list.size-1) and e != list[i+1]} 
+0

आप इसे प्रयोग कर रहे हैं हैश की एक सरणी के साथ काम करने के लिए मिल सकता है! (सरणी से आप सूची का मतलब है।) अच्छा विचार। – sawa

+0

आप देखते हैं कि यह मामला मेरे पुराने प्रश्न को सही बनाता है। इस तरह इटारेटर का उपयोग करना अच्छा होगा: 'list.select {| item | आइटम! = item.next} ' – fl00r

+0

सही ढंग से काम करेंगे नहीं करता है, तो' list', हालांकि एक भी 'nil' मूल्य के साथ समाप्त होता ... –

संबंधित मुद्दे