给出任意列表:
val l = List(2.9940714E7, 2.9931662E7, 2.993162E7, 2.9931625E7, 2.9930708E7, 2.9930708E7, 2.9931477E7)
我需要将每个项目转换为Int。
使用:
l(1).asInstanceOf[Double].toInt
不会
l.foreach{_.asInstanceOf[Double].toInt}
> java.lang.String cannot be cast to java.lang.Double
如果
l.foreach{_.asInstanceOf[String].toDouble.toInt}
> java.lang.Double cannot be cast to java.lang.String
我是Scala的新手。请告诉我我错过了什么。 为什么我可以从列表中转换一个项目,但不能通过迭代器执行此操作? 谢谢!
答案 0 :(得分:3)
您的List
类型为Double
。您只需使用map
操作即可将其转换为Int
类型。尝试以下代码,
val l: List[Double] = List(2.9940714E7, 2.9931662E7, 2.993162E7, 2.9931625E7, 2.9930708E7, 2.9930708E7, 2.9931477E7)
//simply map the list and use toInt
val intLst: List[Int] = l.map(_.toInt)
print(intLst)
//output
//List(29940714, 29931662, 29931620, 29931625, 29930708, 29930708, 29931477)
但是假设您与List
具有相同的List[Any]
,那么您可以使用以下内容将其转换为Int
。
val l: List[Any] = List(2.9940714E7, 2.9931662E7, 2.993162E7, 2.9931625E7, 2.9930708E7, 2.9930708E7, 2.9931477E7)
val intLst: List[Int] = l.map(_.asInstanceOf[Double].toInt)
它将提供与上面相同的输出。
答案 1 :(得分:2)
似乎String
以某种方式结束了List
l
。
给定一个像这样结构的列表(混合整数,Double
和String
s):
val l = List[Any](2.9940714E7, 2.9931625E7, "2.345E8", 345563)
您可以将其转换为整数列表,如下所示:
val lAsInts = l.map {
case i: Int => i
case d: Double => d.toInt
case s: String => s.toDouble.toInt
}
println(lAsInts)
这适用于Double
,Int
和String
。如果在演员表中它仍有一些例外情况崩溃,那么你可以添加更多案例。当然,如果你愿意,你可以在foreach
中做同样的事情,但在这种情况下,它不会做任何事情,因为你不能做任何事情除了铸造之外foreach
的主体。这没有任何有用的副作用(例如它什么都不打印)。
另一种选择是:
lAsInts = l.map{_.toString.toDouble.toInt}
这对所有类型的奇怪输入都更加宽容,至少只要所有值都是"数字"从某种意义上说。
然而,这绝对是代码味道:你是如何得到一个包含如此疯狂的价值观的列表?