2010-08-04 12 views
6

Ich habe eine Liste in scala namens l: List [AType], die ich in die Liste [String] ändern möchte.Die beste Art, Listenart in scala zu ändern

Das klingt vielleicht nach einem sehr dreckigen, ineffizienten Ansatz, aber ich bin mir nicht sicher, wie ich das am besten machen soll. Mein Code war:

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

Ich bin nicht sicher, ob dies ist, wo mein Fehler ist, weil es mir nichts ist zu geben, ist es nicht einmal etwas Druck, auch wenn ich in der Schleife eine print-Anweisung setzen.

Also beschloss ich, dies zu einem Imperativ Art und Weise zu ändern: Dieses Mal, wenn ich Dinge sehen

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

, die ich sehen will, wenn innerhalb der Schleife Druck, aber am Ende des Programm abgestürzt ist mit einem IndexOutOfBound Fehler .

Gibt es einen effizienteren und besseren Weg, dies zu tun?

Danke!

Antwort

12

einen Blick auf die Kartenfunktion nehmen. Zum Beispiel

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

oder

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

Was ist, wenn es von einem anderen Typ ist? Soll ich l.map (_. ToString) .map (_. ToUpperCase) oder l.map (_. ToString._toUpperCase) sagen? Letzteres funktionierte nicht für mich ... –

+3

@the_great_monkey dann ist es 'l.map (_. ToString.toUpperCase)' – Moritz

+0

'l.map (.toString) .map (.toUpperCase)' ist nicht gültig Scala. 'l.map (_. toString.toUpperCase)' funktioniert. Sie hatten ein falsches _ zwischen dem Punkt und dem toUpperCase. –

0

Wie wäre es

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

funktioniert, danke, aber ich bin auf eher einem scala Weg suchen, es zu tun, anstatt java/C++ Art und Weise ... –

+1

'result.update (i, l (i) .toString)' ist etwas besser geschrieben "result (i) = l (i) .toString", aber das ist ziemlich schlecht Scala-Code und funktioniert nur, wenn "result" ist eine veränderbare Klasse und ist nur effizient, wenn es und "l" sind indizierte Sequenzen. Alles in allem würde es niemals als idiomatisches Scala gelten. –

7

Nur eine Bemerkung über die for-Schleife. Hier sind zwei richtige Wege, diese Schleife zu tun:

// 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 Ich wusste das nicht! – 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' ist viel besser – Jus12

1

Haben Sie versucht, für-Comprehensions?

val result=for(elem <- l) yield elem.toString().toUpperCase(); 
Verwandte Themen