【问题标题】:Best way to change list type in scala在scala中更改列表类型的最佳方法
【发布时间】:2011-03-25 13:17:45
【问题描述】:

我在 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 错误而崩溃。

有没有更有效和更好的方法来做到这一点?

谢谢!

【问题讨论】:

    标签: arrays list scala functional-programming copy


    【解决方案1】:

    看看地图功能。例如,

    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)
    

    【讨论】:

    • 如果是其他类型的呢?我说 l.map(.toString).map(.toUpperCase) 还是 l.map(_.toString._toUpperCase) ?后者对我不起作用...
    • @the_great_monkey 然后是l.map(_.toString.toUpperCase)
    • 任何对 Scala 的介绍都将涵盖映射、归约、折叠和高阶函数 (HOF)。 Scala 上已有大量材料,但scala-lang.org/node/1305 是一个不错的起点。
    • 澄清一下,l.map(_.toString) 是写l.map(x =&gt; x.toString) 的更短方式。
    • 这是正确的答案(因为它提到了地图),但理想情况下,示例应该更改列表的类型,例如List("some", "strings").map(_.length):List[Int]
    【解决方案2】:

    只是对 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】:
       def f(s:String) = s.toCharArray // or output something else of any type 
       val l = List("123", "234", "345")
       l.map(f)
      

      【讨论】:

        【解决方案4】:

        你尝试理解了吗?

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

        【讨论】:

          【解决方案5】:

          怎么样

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

          【讨论】:

          • 它可以工作,谢谢,但我正在寻找更多的 scala 方式而不是 java/c++ 方式......
          • result.update(i, l(i).toString) 写得稍微好一点 result(i) = l(i).toString,但这是非常糟糕的 Scala 代码,并且仅当 result 是可变类并且仅当它和 l 是索引序列时才有效.总而言之,它永远不会成为惯用的 Scala。
          猜你喜欢
          • 1970-01-01
          • 2016-11-12
          • 1970-01-01
          • 1970-01-01
          • 2015-07-11
          • 2012-05-05
          • 2012-04-28
          • 2013-11-21
          • 1970-01-01
          相关资源
          最近更新 更多