scala将字符串转换为longs列表

时间:2015-02-19 09:07:14

标签: scala

我有一个问题。我处理遗留代码,我在scala中发现了这一点。我应该做一些代码重构。

val elements: List[Map[String, String]] = calculateElements(south, west, north, east)

elements.foreach { e =>
  if (e("type") == "way") {
    var way_nodes = e("nodes").asInstanceOf[List[Long]]
    ...
  }
}

此代码工作正常,但是当我尝试将此方法移动到另一个项目以便我可以对其进行测试时,它会失败。

java.lang.String cannot be cast to scala.collection.immutable.List

是否可以将String转换为Long列表?

旧代码在Scala 2.8.1中运行,新的测试项目在Scala 2.11.2中运行。

2 个答案:

答案 0 :(得分:1)

如果来自源的输入并非完全由您控制,那么您应该添加更多检查以处理以下情况。

scala> " ".split(",").map(_.trim).filter(_.length > 
0).map(_.toLong).toList
res3: List[Long] = List()

scala> "12, 34".split(",").map(_.trim).filter(_.length > 
0).map(_.toLong).toList
res4: List[Long] = List(12, 34)

scala> "12,34".split(",").map(_.trim).filter(_.length > 
0).map(_.toLong).toList
res5: List[Long] = List(12, 34)

所以,最简单的(没有隐藏潜在的java.lang.NumberFormatException,如果你期望输入最多只包含数字和逗号),那么以下就足够了

 <your variable>.split(",").map(_.trim).filter(_.length > 
0).map(_.toLong).toList

答案 1 :(得分:0)

对于e("nodes"),假设以逗号分隔的整数值字符串

val nodes = "123,  -2, 0, 67"

要将此类字符串转换为Long的集合,请考虑例如

nodes.split(",").map(_.trim.toLong)
Array[Long] = Array(123, -2, 0, 67)

另请注意,Scala中的String配备了有序集合中的方法,以便String可以被视为Char的序列。因此,假设现在原始字符串是这种形式,

val nodes = "43217"

并希望将其转换为Long的集合,然后

nodes.map(_.asDigit.toLong)
Vector(4, 3, 2, 1, 7)

然而,以下内容将字符串中的每个字符转换为其关联的ASCII数值

nodes.map(_.toLong)
Vector(52, 51, 50, 49, 55)