2010-08-04 10 views
6

Tengo una lista en scala llamada l: Lista [AType] que quiero cambiar a la lista [String].La mejor manera de cambiar el tipo de lista en scala

Esto puede sonar como un enfoque muy sucio e ineficiente, pero no estoy seguro de la mejor manera de hacerlo. Mi código era:

var result = new Array[String]("a","b") 
l foreach { case a => result = result :+ (a.toString().toUpperCase()); } 
result toList 

No estoy seguro de si esto es donde está mi error, porque no me da nada, no es incluso imprimir cualquier cosa, incluso si pongo una declaración de impresión dentro del bucle.

así que decidí cambiar a un modo más imprescindible:

for(i <- 0 to l.length) { 
    result.update(i, l(i).toString) 
} 

Esta vez que veo cosas que quiero ver cuando se imprime dentro del bucle, pero al final del programa bloqueado con un error IndexOutOfBound .

¿Hay alguna manera más eficiente y mejor de hacer esto?

Gracias!

Respuesta

12

Tome un vistazo a la función de mapa. Por ejemplo,

scala> List("Some", "Strings").map(_.toUpperCase) 
res2: List[java.lang.String] = List(SOME, STRINGS) 

o

scala> List("Some", "Strings").map(_.length) 
res0: List[Int] = List(4, 7) 
+0

¿Qué tal si es de otro tipo? ¿Digo l.map (_. ToString) .map (_. ToUpperCase) o l.map (_. ToString._toUpperCase)? Este último no funcionó para mí ... –

+3

@the_great_monkey, entonces es 'l.map (_. ToString.toUpperCase)' – Moritz

+0

'l.map (.toString) .map (.toUpperCase)' no es válido Scala. 'l.map (_. toString.toUpperCase)' funciona. Tuviste un falso _ entre el punto y el toUpperCase. –

0

¿Qué tal

for(i <- 0 to l.length-1) { 
    result.update(i, l(i).toString) 
} 
+0

funciona, gracias, pero estoy mirando más de una manera de hacerlo Scala en lugar de Java/C++ manera ... –

+1

'result.update (I, L (i) .toString)' es ligeramente mejor escrito 'result (i) = l (i) .toString', pero este es un código de Scala bastante malo y funciona solo cuando' result' es una clase mutable y solo es eficiente cuando it y 'l' son secuencias indexadas. Todo eso, nunca calificaría como Scala idiomático. –

7

Sólo una observación sobre el bucle. Aquí hay dos formas correctas de hacer ese bucle:

// Using "until" instead of "to": a until b == a to (b - 1) 
for(i <- 0 until l.length) { 
    result.update(i, l(i).toString) 
} 

// Using "indices" to get the range for you 
for(i <- l.indices) { 
    result.update(i, l(i).toString) 
} 
+0

+1 ¡No lo conocía! – retronym

3
def f(s:String) = s.toCharArray // or output something else of any type 
val l = List("123", "234", "345") 
l.map(f) 
+0

'l map f' es mucho mejor – Jus12

1

qué trataste de-comprensiones?

val result=for(elem <- l) yield elem.toString().toUpperCase(); 
Cuestiones relacionadas