Scala Cast Any 列表到 Int 列表
Scala Cast List of Any to list of Int
给出任意列表:
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 新手。请告诉我我缺少什么。
为什么我可以从列表中转换一项,但不能通过迭代器执行此操作?
谢谢!
您给定的 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[Any]
相同的 List
,那么您可以使用以下方法将其转换为 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)
它将给出与上面相同的输出。
似乎 String
以某种方式最终出现在您的 List
l
中。
给定一个结构如下的列表(混合整数,Double
s 和 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
s、Int
s 和 String
s。如果它在转换过程中仍然因某些异常而崩溃,那么您可以添加更多案例。当然,如果你愿意,你可以在 foreach
中做同样的事情,但在这种情况下它不会做任何事情,因为你不会 do foreach
的正文,除了铸造。这没有有用的副作用(例如,它什么都不打印)。
另一种选择是:
lAsInts = l.map{_.toString.toDouble.toInt}
这在某种程度上对所有奇怪的输入更加宽容,至少只要所有值在某种意义上都是 "numeric"。
然而,这绝对是代码的味道:你是如何得到一个开始时包含如此多值的列表的?
给出任意列表:
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 新手。请告诉我我缺少什么。 为什么我可以从列表中转换一项,但不能通过迭代器执行此操作? 谢谢!
您给定的 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[Any]
相同的 List
,那么您可以使用以下方法将其转换为 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)
它将给出与上面相同的输出。
似乎 String
以某种方式最终出现在您的 List
l
中。
给定一个结构如下的列表(混合整数,Double
s 和 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
s、Int
s 和 String
s。如果它在转换过程中仍然因某些异常而崩溃,那么您可以添加更多案例。当然,如果你愿意,你可以在 foreach
中做同样的事情,但在这种情况下它不会做任何事情,因为你不会 do foreach
的正文,除了铸造。这没有有用的副作用(例如,它什么都不打印)。
另一种选择是:
lAsInts = l.map{_.toString.toDouble.toInt}
这在某种程度上对所有奇怪的输入更加宽容,至少只要所有值在某种意义上都是 "numeric"。
然而,这绝对是代码的味道:你是如何得到一个开始时包含如此多值的列表的?