2012-04-14 19 views
7

Sto provando a scambiare ogni coppia di valori nel mio array usando for e yield e fino ad ora sono molto infruttuoso. Quello che ho provato è la seguente:Scambio di valori di array con scala for e yield

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 

Il dato frammento di sopra restituisce il 2,1,4,3 vettore (e il 5 è omessa)

Qualcuno può sottolineare quello che sto facendo male qui e come ottenere la corretta inversione usando per e rese?

Grazie

+7

Questo è da "Scala per gli impazienti". Esercizio 3.2 – Zotov

risposta

11

Sarebbe più facile se si utilizza didin't for/yield:

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

Questo è probabilmente un modo maturo di fare le cose. Sto imparando scala e mi stavo chiedendo se lo stesso potrebbe essere realizzato usando per/rendimento. –

+0

@sc_ray, La costruzione 'for/yield' rende le cose molto più piacevoli, ma questo non è un ottimo abbinamento. – dhg

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

o se avete bisogno di/rendimento (molto meno concisa in questo caso, e in realtà si espande per lo stesso codice):

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

Mi piace l'uso di 'reverse'. Bello. – dhg

+0

L'esercizio dice di fare un ciclo, quindi di fare un rendimento/rendimento, non una soluzione funzionale. Bello però ... – Rob

8

non so se l'OP sta leggendo Scal a per Impaziente, ma questo era esercizio 3.3.

Mi piace la soluzione di mappa, ma non siamo ancora in quel capitolo, quindi questa è la mia brutta implementazione utilizzando la richiesta di/yield. Probabilmente puoi spostare qualche logica di rendimento in una guardia/definizione.

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

Sono un tipo Java, quindi non ho nessuna conferma di questa affermazione, ma sono curioso di ciò che l'overhead delle mappe/raggruppamento e iteratori sono. Sospetto che tutto si compili sullo stesso codice byte Java.

+0

Bello. Questo sembra essere più nello spirito dell'esercizio. –

+0

Buona risposta per la domanda posta. –

0

Un altro semplice, per la resa soluzione:

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

Se stai facendo esercizi 3.2 e 3.3 a Scala per l'Impaziente qui sono entrambe le mie risposte. Sono gli stessi con la logica spostata.

/** 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

Ho la mia soluzione, ma senza rendimento. Forse qualcuno lo troverà utile.

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 
    }