Scala将任意列表转换为Int列表
给出以下各项的清单:Scala将任意列表转换为Int列表,scala,int,double,any,Scala,Int,Double,Any,给出以下各项的清单: 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 jav
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(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
我是斯卡拉的新手。请告诉我我错过了什么。
为什么我可以从列表中强制转换一个项目,但不能通过迭代器执行此操作?
谢谢 您给定的
列表
类型为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)
它将给出与上面相同的输出。似乎一个
字符串
不知何故出现在您的列表中
给定如下结构的列表(使用混合整数、Double
s和String
s):
您可以将其转换为整数列表,如下所示:
val lAsInts = l.map {
case i: Int => i
case d: Double => d.toInt
case s: String => s.toDouble.toInt
}
println(lAsInts)
这适用于Double
s、Int
s和String
s。如果在强制转换过程中仍出现一些异常而崩溃,则可以添加更多案例。当然,如果愿意,您可以在foreach
中执行相同的操作,但在这种情况下,它不会执行任何操作,因为在foreach
的主体中,除了铸造之外,您不会执行任何操作。这没有任何有用的副作用(例如,它不打印任何内容)
另一种选择是:
lAsInts = l.map{_.toString.toDouble.toInt}
这在某种程度上对所有奇怪的输入都更加宽容,至少只要所有的值在某种意义上都是“数字”
然而,这绝对是一种代码味道:您是如何得到一个包含如此多值的列表的?这是一个很长的故事。我有一些json,有许多不同类型的属性。我从Redis中提取了这些数据,并用scala.util.parsing.json进行了解析。它返回了Map[String,Any],但在解析后,它将字符串类型为“29940714”的值转换为Any 2.9940714E7。然后我用case类映射得到的映射,使其具有具有必要数据的对象,然后根据一些属性进行过滤。无论如何,toString.toDouble.toInt工作得很好。谢谢!