वहाँ विभिन्न रहे हैं इसे फिल्टर के साथ करने के फैंसी तरीके हैं, लेकिन अधिकतर शायद एक के बजाय दो पास की आवश्यकता होगी, ताकि आप केवल फॉर-लूप का उपयोग कर सकें।
अंतरिक्ष अप-फ्रंट का संरक्षण इस मामले में एक बड़ा अंतर डाल सकता है क्योंकि यदि स्रोत बड़ा है तो यह अनावश्यक पुन: आवंटन से बच जाएगा क्योंकि नए सरणी बढ़ती हैं, और आवश्यक स्थान की गणना सरणी पर निरंतर समय में होती है।
// could make this take a more generic random-access collection source
// if needed, or just make it an array extension instead
func splitAlternating<T>(source: [T]) -> ([T],[T]) {
var evens: [T] = [], odds: [T] = []
evens.reserveCapacity(source.count/2 + 1)
odds.reserveCapacity(source.count/2)
for idx in indices(source) {
if idx % 2 == 0 {
evens.append(source[idx])
}
else {
odds.append(source[idx])
}
}
return (evens,odds)
}
let a = [0,1,2,3,4,5,6]
splitAlternating(a) // ([0, 2, 4, 6], [1, 3, 5])
यदि प्रदर्शन सही मायने में महत्वपूर्ण है, आप source.withUnsafeBufferPointer
इस्तेमाल कर सकते हैं, स्रोत तत्वों का उपयोग करने के सूचकांक सीमा जाँच से बचने के लिए।
सरणियों वास्तव में बहुत बड़ा, और आप को छोड़कर तत्वों की एक छोटी संख्या के नमूने के लिए परिणामी डेटा का उपयोग करने नहीं जा रहे हैं, आप के बजाय एक आलसी दृश्य का उपयोग (हालांकि एसटीडी आलसी फिल्टर प्रतिसाद नहीं लिब 'पर विचार कर सकते हैं, तो यहां बहुत अधिक उपयोग नहीं किया जाता है क्योंकि यह अनुक्रम को संग्रहित नहीं करता है - आपको संभवतः अपना खुद का लिखना होगा)।
स्रोत
2015-03-15 02:59:32
सबसे अच्छा आप प्राप्त करने के लिए जा रहे हैं का उपयोग किया जाएगा है 'O (n) '। बस पुराने के माध्यम से दो नए सरणी और पाश बनाएं, वैकल्पिक रूप से जहां आप प्रत्येक पुनरावृत्ति पर तत्व डालते हैं। – royhowie