Arrays 在Scala中将未知类标记转换为浮点
我有一个名为Arrays 在Scala中将未知类标记转换为浮点,arrays,scala,casting,type-conversion,Arrays,Scala,Casting,Type Conversion,我有一个名为data的变量。此数据的类型为数组[ED]。现在在运行时,ED的类型可以是Integer或Double。我想把这个数组转换成数组[Float]的数组。我尝试了data.map(x=>x.asInstanceOf[Float].floatValue),但不幸的是,它返回了ClassCastException异常。我想知道转换此数组的正确方法是什么?任何数值值都可以转换为浮点值 def toFloat[N](n :N)(implicit ev :Numeric[N]) :Float =
data
的变量。此数据的类型为数组[ED]
。现在在运行时,ED的类型可以是Integer
或Double
。我想把这个数组转换成数组[Float]
的数组。我尝试了data.map(x=>x.asInstanceOf[Float].floatValue)
,但不幸的是,它返回了ClassCastException异常。我想知道转换此数组的正确方法是什么?任何数值
值都可以转换为浮点值
def toFloat[N](n :N)(implicit ev :Numeric[N]) :Float =
ev.toDouble(n).floatValue()
toFloat(9) //res0: Float = 9.0
toFloat(9.2D) //res1: Float = 9.2
但是,如果编译器不将您的ED
类型识别为数值
,则这不会有帮助。任何数值
值都可以转换为浮点值
def toFloat[N](n :N)(implicit ev :Numeric[N]) :Float =
ev.toDouble(n).floatValue()
toFloat(9) //res0: Float = 9.0
toFloat(9.2D) //res1: Float = 9.2
但是,如果编译器不将您的ED
类型识别为数值
类型,则这不会有任何帮助。您可以将此未知类型转换为数字
,因为数字
是所有数值类的超类
def convertToFloat[T](arr: Array[T]): Array[Float] = {
arr.map(_.asInstanceOf[Number].floatValue())
}
def main(args: Array[String]): Unit = {
println(convertToFloat(Array(1.234456335664756746, 2.324902485349859)).mkString(", "))
println(convertToFloat(Array(1, 2, 3)).mkString(", "))
}
输出为:
1.2344563,2.3249025
1.0、2.0、3.0
您可以将此未知类型转换为Number
,因为Number
是所有数值类的超类
def convertToFloat[T](arr: Array[T]): Array[Float] = {
arr.map(_.asInstanceOf[Number].floatValue())
}
def main(args: Array[String]): Unit = {
println(convertToFloat(Array(1.234456335664756746, 2.324902485349859)).mkString(", "))
println(convertToFloat(Array(1, 2, 3)).mkString(", "))
}
输出为:
1.2344563,2.3249025
1.0、2.0、3.0
您可以使用collect
获取数组中的值:
data.collect{ case n: Number => n.floatValue }
这将跳过任何非数字值,因此如果要检查这一点,请添加一个大小写
我还建议使用本机Scala类型,如List
和Vector
,而不是Array
,后者只是Java数组的包装器,不太适合Scala类型系统
请注意,Number
是一个相当棘手的问题,因为它是一个Java类型,实际上不在Scala类型层次结构中。如果要避免这种情况,以下方法同样有效:
data.map(_.toString.toFloat)
您可以使用collect
获取数组中的值:
data.collect{ case n: Number => n.floatValue }
这将跳过任何非数字值,因此如果要检查这一点,请添加一个大小写
我还建议使用本机Scala类型,如List
和Vector
,而不是Array
,后者只是Java数组的包装器,不太适合Scala类型系统
请注意,Number
是一个相当棘手的问题,因为它是一个Java类型,实际上不在Scala类型层次结构中。如果要避免这种情况,以下方法同样有效:
data.map(_.toString.toFloat)
如何定义ED
?(它是类型同义词、特征、类等?)正试图从Double
转换为Float
?如何定义ED
?(它是类型同义词、特征、类等?)正试图从Double
转换为Float
?Number
实际上不是Int
和Float
的超类,但是有足够的自动转换来实现这一点。Number
实际上不是Int
和Float
的超类,但是有足够的自动转换来实现这一点。