2012-04-14 10 views
7

Estoy tratando de intercambiar cada par de valores en mi matriz usando for y yield y hasta ahora no he tenido éxito. Lo que he intentado es el siguiente:Intercambiando valores de matriz con for y yield scala

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 

El fragmento dado anteriormente devuelve el vector de 2,1,4,3 (y se omite la 5)

Puede alguien señalar lo que estoy haciendo mal aquí y cómo obtener la inversión correcta usando for y yields?

Gracias

+7

Esto es de "Scala para los impacientes". Ejercicio 3.2 – Zotov

Respuesta

11

sería más fácil si se utiliza 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

Esta es probablemente una forma madura de hacer las cosas. Estoy aprendiendo scala y me preguntaba si lo mismo podría lograrse usando for/yield. –

+0

@sc_ray, la construcción 'for/yield 'hace las cosas más agradables la mayor parte del tiempo, pero no es una buena combinación. – dhg

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

o si necesita para el/rendimiento (mucho menos concisa en este caso, y de hecho se expande al mismo código):

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

Me gusta el uso de 'reverse'. Bonito. – dhg

+0

El ejercicio dice hacer un ciclo, luego hacer un for/yield, no una solución funcional. Aunque agradable ... – Rob

8

no sé si el PO está leyendo Scal a para el Impaciente, pero este fue el ejercicio 3.3.

Me gusta la solución de mapa, pero todavía no estamos en ese capítulo, así que esta es mi fea implementación utilizando el requerido para/yield. Probablemente pueda mover cierta lógica de rendimiento a una guardia/definición.

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

Soy un tipo Java, por lo que he no hay confirmación de esta afirmación, pero tengo curiosidad lo que la sobrecarga de los mapas/agrupación y iteradores son. Sospecho que todo se compila con el mismo código de bytes Java.

+0

Nice. Esto parece estar más en el espíritu del ejercicio. –

+0

Buena respuesta para la pregunta. –

0

Otra sencilla, con fines de rendimiento de la solución:

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

Si usted está haciendo ejercicios 3.2 y 3.3 en la Scala para impacientes aquí están ambas mis respuestas. Son lo mismo con la lógica que se mueve.

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

Tengo mi solución, pero sin rendimiento. Quizás alguien lo encuentre útil.

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 
    } 
Cuestiones relacionadas