2012-04-14 64 views
7

के साथ सरणी मूल्यों को स्वैप करना और मैं उपज और उपज का उपयोग करके अपने सरणी में मूल्यों की प्रत्येक जोड़ी को स्वैप करने की कोशिश कर रहा हूं और अब तक मैं असफल हूं। क्या मैं कोशिश की है इस प्रकार है:स्काला

val a = Array(1,2,3,4,5) //What I want is Array(2,1,4,3,5) 

for(i<-0 until (a.length-1,2),r<- Array(i+1,i)) yield r 

ऊपर दिए गए टुकड़ा रिटर्न वेक्टर 2,1,4,3 (और 5 छोड़ दिया जाता है)

किसी का कहना है सकते हैं कि मैं गलत यहाँ क्या कर रहा हूँ और उपज और उपज का उपयोग करके सही उलटा कैसे प्राप्त करें?

धन्यवाद

+7

यह "अधीर के लिए स्कैला" से है। व्यायाम 3.2 – Zotov

उत्तर

11

यह आसान अगर आप for/yield का उपयोग didin't होगा:

a.grouped(2) 
    .flatMap{ 
    case Array(x,y) => Array(y,x) 
    case Array(x) => Array(x) 
    }.toArray // Array(2, 1, 4, 3, 5) 
+2

यह शायद चीजों को करने का एक परिपक्व तरीका है। मैं स्कैला सीख रहा हूं और सोच रहा था कि क्या इसे उपज/उपज के उपयोग से पूरा किया जा सकता है। –

+0

@sc_ray, 'के लिए/उपज' निर्माण चीजें बहुत अच्छी तरह से बनाता है, लेकिन यह इसके लिए एक अच्छा मैच नहीं है। – dhg

35
a.grouped(2).flatMap(_.reverse).toArray 

या आप के लिए/उपज (बहुत कम संक्षिप्त इस मामले में की जरूरत है, और अगर तथ्य फैलता में एक ही कोड के लिए):

(for {b <- a.grouped(2); c <- b.reverse} yield c).toArray 
+0

मुझे 'रिवर्स 'के उपयोग पसंद हैं। अच्छा लगा। – dhg

+0

अभ्यास कहता है कि एक लूप करें, फिर एक कार्यात्मक समाधान के लिए एक उपज/उपज करें। अच्छा हालांकि ... – Rob

8

मैं अगर ओपी पढ़ रही है scal पता नहीं है एक Impatient के लिए, लेकिन यह व्यायाम 3.3 था।

मुझे नक्शा समाधान पसंद है, लेकिन हम अभी तक उस अध्याय पर नहीं हैं, इसलिए यह आवश्यक/उपज के उपयोग से मेरा बदसूरत कार्यान्वयन है। आप शायद कुछ उपज तर्क को गार्ड/परिभाषा में ले जा सकते हैं।

for(i <- 0 until(a.length,2); j <- (i+1).to(i,-1) if(j<a.length)) yield a(j) 

मैं एक जावा पुरुष हूँ, इसलिए मैं इस दावे की कोई पुष्टि नहीं है, लेकिन मैं उत्सुक क्या नक्शे/समूह के भूमि के ऊपर और iterators हैं हूँ। मुझे संदेह है कि यह सब एक ही जावा बाइट कोड पर संकलित है।

+0

अच्छा। यह अभ्यास की भावना में और अधिक प्रतीत होता है। –

+0

प्रश्न के लिए अच्छा जवाब पूछा गया। –

0

एक और सरल, के लिए उपज समाधान:

def swapAdjacent(array: ArrayBuffer[Int]) = { 
    for (i <- 0 until array.length) yield (
     if (i % 2 == 0) 
      if (i == array.length - 1) array(i) else array(i + 1) 
     else array(i - 1) 
    ) 
} 
0

आप अधीर के लिए स्काला में अभ्यास 3.2 और 3.3 कर रहे हैं यहाँ हैं मेरे दोनों जवाब। तर्क के साथ वे समान हैं।

/** Excercise 3.2 */ 
for (i <- 0 until a.length if i % 2 == 1) {val t = a(i); a(i) = a(i-1); a(i-1) = t } 
/** Excercise 3.3 */ 
for (i <- 0 until a.length) yield { if (i % 2 == 1) a(i-1) else if (i+1 <= a.length-1) a(i+1) else a(i) } 
0
for (i <- 0 until arr.length-1 by 2) { val tmp = arr(i); arr(i) = arr(i+1); arr(i+1) = tmp } 

मैं स्काला हाल ही में जानने के लिए शुरू कर दिया है और पुस्तक अधीर (1 संस्करण) के लिए स्काला से सभी समाधान मेरी GitHub पर उपलब्ध हैं:

अध्याय 2 https://gist.github.com/carloscaldas/51c01ccad9d86da8d96f1f40f7fecba7

अध्याय 3 https://gist.github.com/carloscaldas/3361321306faf82e76c967559b5cea33

0

मेरे पास मेरा समाधान है, लेकिन उपज के बिना। शायद किसी को यह उपयोगी मिलेगा।

def swap(x: Array[Int]): Array[Int] = { 
    for (i <- 0 until x.length-1 by 2){ 
     var left = x(i) 
     x(i) = x(i+1) 
     x(i+1) = left 
    } 
    x 
    }