2010-08-04 17 views
6

Ho una lista in scala chiamata l: Lista [AType] che voglio cambiare alla lista [String].Il modo migliore per cambiare il tipo di lista in scala

Questo può sembrare un approccio molto sporco e inefficiente, ma non sono del tutto sicuro del modo migliore per farlo. Il mio codice è:

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

Io non sono sicuro se questo è dove il mio errore è, perché non mi sta dando nulla, non è nemmeno la stampa di qualsiasi cosa, anche se ho messo una dichiarazione di stampa all'interno del ciclo.

così ho deciso di cambiare questo ad un modo più imperativo:

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

Questa volta vedo cose che voglio vedere quando si stampa all'interno del ciclo, ma alla fine il programma si è bloccato con un errore IndexOutOfBound .

Esiste un modo più efficiente e migliore per farlo?

Grazie!

risposta

12

Date un'occhiata alla funzione di carta. Ad esempio,

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

E se fosse di un altro tipo? Devo dire l.map (_. ToString) .map (_. ToUpperCase) o l.map (_. ToString._toUpperCase)? Quest'ultimo non ha funzionato per me ... –

+3

@the_great_monkey quindi è 'l.map (_. ToString.toUpperCase)' – Moritz

+0

'l.map (.toString) .map (.toUpperCase)' non è valido Scala. 'l.map (_. toString.toUpperCase)' funziona. Hai avuto uno spurio _ tra il punto e toUpperCase. –

0

Come su

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

funziona, grazie, ma sto guardando più di un modo per farlo scala piuttosto che Java/C++ modo ... –

+1

'result.update (I, L (i) .toString)' è leggermente meglio scritto 'result (i) = l (i) .toString', ma questo è un codice Scala piuttosto scadente e funziona solo quando' result' è una classe mutabile ed è efficiente solo quando e 'l' sono sequenze indicizzate. Tutto sommato, non si qualificherebbe mai come Scala idiomatica. –

7

Solo un'osservazione sul ciclo for. Qui ci sono due modi di fare corretti quel ciclo:

// 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 Non lo sapevo! – 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' è molto meglio – Jus12

1

Hai provato per-comprensioni?

val result=for(elem <- l) yield elem.toString().toUpperCase(); 
Problemi correlati