2009-11-25 12 views
14

से नहीं के बराबर तत्वों को हटाने के दो बराबर टुकड़ों में एक सरणी मैं यह कर होता है, विभाजित करने के लिएआतंक विरोधी/रूबी नेस्टेड सरणी

>> a = [1,2,3,4,5] 
=> [1, 2, 3, 4, 5] 
>> a.in_groups_of((a.size/2.0).ceil) if a.size > 0 
=> [[1, 2, 3], [4, 5, nil]] 

अब मैं एक नेस्टेड सरणी कि शून्य तत्व शामिल हैं मिल गया है, तो सरणी के आकार अजीब है। मैं नेस्टेड सरणी से नील तत्वों को कैसे हटा सकता हूं? मैं की तरह कुछ करने के लिए,

a.compact 

लेकिन दुर्भाग्य से वह काम नहीं करता चाहते हैं, माणिक केवल प्रथम स्तर पर नहीं के बराबर तत्वों और नहीं रिकर्सिवली निकाल देता है। क्या रूबी इस समस्या के लिए कोई अच्छा समाधान प्रदान करता है?

उत्तर

44
रूबी 1.8.7 के साथ

बदलना चाहते हैं और बाद में आप निम्न कर सकते हैं:

a.each &:compact! 
=> [[1, 2, 3], [4, 5]] 

रुबी 1.8.6 के साथ, आपने यह लंबा रास्ता किया है:

a.each {|s| s.compact!} 

इनमें से दोनों a की सामग्री को संशोधित करेंगे। आप एक नई सरणी लौट सकते हैं और मूल अकेला छोड़ने के लिए चाहते हैं, आप each के बजाय collect उपयोग कर सकते हैं:

# 1.8.7+: 
a.collect &:compact 

# 1.8.6: 
a.collect {|s| s.compact} 
+3

मैंने सोचा था कि & वाक्यविन्यास 1.8.7 – EmFi

+1

@EmFi अच्छा बिंदु में पेश किया गया था - मैं 1.8.7 भूल रहा था। मैं अपना जवाब संपादित करूंगा। –

+0

आप 'ए.मैप (और: कॉम्पैक्ट)' का भी उपयोग कर सकते हैं – Bongs

-3
a.each {|subarray| subarray.compact!} 
a.compact! 

काम करना चाहिए ....

+2

शायद नेक्रो-पोस्टिंग के लायक नहीं है, लेकिन यह दो पंक्तियां विपरीत क्रम में होनी चाहिए। अगर हम मानते हैं कि 'ए' में शून्य है तो हमें पहले * कॉम्पैक्ट करना चाहिए * अन्यथा हमें ब्लॉक के अंदर शून्य-त्रुटियां मिलेंगी। – NIA

3

जब तक आप स्थायी रूप से एक

a.map do |e| 
    e.compact 
end 
8

आप in_groups_of उपयोग किया है तो आप दूसरा तर्क के रूप में यह पारित कर सकते हैं false और इसे भरने नहीं होगा nil के साथ "रिक्त स्थान" में, लेकिन वास्तव में कुछ भी नहीं।

0
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4, 5, nil]] 

def compact_nested(array) 
    arr2=[] 
    array.each { |x| 
    element = x.class==Array ? x.compact : x 
    arr2<<element 
    } 
    arr2 
end 

p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]] 
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]] 
संबंधित मुद्दे