2017-08-24 8 views
11

में सरणी से शून्य मान अनुगामी निकालें मैं इस तरह एक सरणी कुछ है।माणिक

मैंने arr.map {|x| x.pop until x.last} की कोशिश की लेकिन इस दृष्टिकोण के साथ समस्या यह है कि जब सरणी के सभी मान दिए गए सरणी में तीसरे सरणी में शून्य होते हैं, तो लूप स्टक्स।

until x.last स्थिति के कारण, यदि सभी मान शून्य हैं तो मानचित्र फ़ंक्शन मुझे एक खाली सरणी वापस कर देना चाहिए?

इसके लिए क्या शर्तें होनी चाहिए।

उत्पादन होना चाहिए

[['a'],['b','nil','c'],[]] 

याद रखें मैं बस के बीच में नहीं nil मूल्यों अनुगामी निकालना चाहते हैं।

+3

के बीच 'nil' मूल्यों वास्तव में 'nil'' तार' करने के लिए परिवर्तित किया जाना चाहिए? – Stefan

उत्तर

10

आप सही रास्ते पर हैं, लेकिन सिर्फ एक बिट को संशोधित अपने कोड:

array.each { |e| e.pop until !e.last.nil? || e.empty? } 
#=> [["a"], ["b", nil, "c"], []] 

यह reverse का उपयोग कर की तुलना में तेजी है - reverse और drop_while

+0

मुझे लगता है कि मूल बिंदु यह है कि मूल को म्यूट करना वांछित है या नहीं। हालांकि एक प्रति + पॉप अभी भी तेज, सच हो सकता है। –

12

इसके लिए आप बाहरी सरणी के बारे में भूल सकते हैं और इसे केवल आंतरिक सरणी के लिए हल कर सकते हैं, फिर map का उपयोग उन सभी के लिए समाधान लागू करने के लिए करें।

drop_while कुछ ऐसी स्थिति के बिना एक नई सरणी लौटाएगा जो कुछ शर्त से मिले (उदा। nil?)। आप पीछे हटना चाहते थे, इसलिए reverse के साथ गठबंधन करें।

[nil,nil,5,nil,6,nil].reverse.drop_while(&:nil?).reverse 
[nil, nil, 5, nil, 6] 

फिर सभी सरणी के लिए मानचित्र का उपयोग करें।

arr = [["a", nil, nil, nil], ["b", nil, "c", nil], [nil, nil, nil, nil]] 
arr.map{|a| a.reverse.drop_while(&:nil?).reverse} 
[["a"], ["b", nil, "c"], []] 

आप किसी भी शेष nil वास्तव में एक स्ट्रिंग होना चाहते हैं, तो आप इसे किसी भी तरह के रूपांतरण आप की तरह प्रदर्शन कर एक और नक्शे के साथ गठबंधन कर सकते हैं।

4

एक और विकल्प का उपयोग करने के लिए है rindex:

arr.map do |e| 
    index = e.rindex { |i| !i.nil? } # the last index of not `nil` element 
    index ? e.first(index + 1) : e 
end 
#=> [["a"], ["b", nil, "c"], []]