2010-08-04 2 views
6

У меня есть список в scala, называемый l: List [AType], который я хочу изменить в список [String].Лучший способ изменить тип списка в scala

Это может показаться очень грязным, неэффективным подходом, но я не совсем уверен в наилучшем способе этого. Мой код был:

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

Я не уверен, если это то, где моя ошибка состоит в том, потому что это не дает мне ничего, это даже не печатать ничего, даже если я положил заявление для печати внутри цикла.

Так что я решил изменить это более настоятельной образом:

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

На этот раз я вижу вещи, которые я хочу видеть, когда печать внутри цикла, но в конце концов программа разбился с ошибкой IndexOutOfBound ,

Есть ли более эффективный и лучший способ сделать это?

Спасибо!

ответ

12

Посмотрите на функцию карты. Например,

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

или

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

А если это из другого типа? Я говорю l.map (_. ToString) .map (_. ToUpperCase) или l.map (_. ToString._toUpperCase)? Последний не работал для меня ... –

+3

@the_great_monkey, то это 'l.map (_. ToString.toUpperCase)' – Moritz

+0

'l.map (.toString) .map (.toUpperCase)' неверно Scala. 'l.map (_. toString.toUpperCase)' работает. У вас был паразитный _ между точкой и toUpperCase. –

0

Как насчет

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

это работает, спасибо, но я смотрю на больше лестницу, как это сделать, а не Java/C++ путь ... –

+1

'result.update (я, л (я) .ToString)' (i) = l (i) .toString', но это довольно плохой код Scala и работает только тогда, когда 'result' является изменяемым классом и эффективен только тогда, когда он и' l' являются проиндексированными последовательностями. Все это, это никогда не будет квалифицироваться как идиоматическая Скала. –

7

Просто замечание на цикл. Вот два правильных способа сделать это цикл:

// 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 Я не знал этого! – 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' намного лучше – Jus12

1

ли вы попробовать-постижений?

val result=for(elem <- l) yield elem.toString().toUpperCase(); 
Смежные вопросы