Лучший способ изменить тип списка в Scala - PullRequest
6 голосов
/ 05 августа 2010

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

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

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

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

Поэтому я решил изменить это на более императивный способ:

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

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

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

Спасибо!

Ответы [ 5 ]

13 голосов
/ 05 августа 2010

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

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)
7 голосов
/ 05 августа 2010

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

// 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)
}
3 голосов
/ 06 августа 2010
 def f(s:String) = s.toCharArray // or output something else of any type 
 val l = List("123", "234", "345")
 l.map(f)
1 голос
/ 07 августа 2010

Вы пробовали за понимание?

val result=for(elem <- l) yield elem.toString().toUpperCase();
0 голосов
/ 05 августа 2010

Как насчет

for(i <- 0 to l.length-1) {
    result.update(i, l(i).toString)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...