更改数组元素的类型

时间:2016-01-30 11:20:17

标签: scala

如何将以下数组转换为Array [(Long,Long,Long)]

类型之一
Array[(Any, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))

我已尝试映射第一个元素test.map(x => (x._1).toLong)

但我得到

  

错误:值toLong不是Any

的成员

2 个答案:

答案 0 :(得分:1)

问题不完整。首先为什么第一个元组元素的类型为Any,我们怎么知道如何将它转换为Long?答案可能会有很大的不同,具体取决于该对象的运行时类型。

Kao也没有回答这个问题,即如何将其变成Array[(Long, Long, Long)],而不是Array[Long]。 基本上有两种方法可以做到这一点。使用复制方法:

test map {x => x.copy(_1 = x._1.…)}

或使用部分函数文字:

test map {case (x,y,z) => (x.…, y, z)}

虽然前者略显简洁,但后者为您提供了额外的可能性。例如,您可以使用collect方法删除无法转换的元素,也可以处理不同类型的值,例如BigInt和BigInteger:

test collect {
    case (x: BigInt, y, z) => (x.longValue, y, z)
    case (x: BigInteger, y, z) => (x.longValue, y, z)
}

(注意:如果BigInts实际上不适合长,那么此代码将返回虚假值,因此应该在生产代码中检查它。)

答案 1 :(得分:0)

您需要告诉编译器您尝试映射的Any元素的类型是什么。您可以使用asInstanceOf

执行此操作
val t: Array[(Any, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))
t.map(x=> x._1.asInstanceOf[Number].longValue)

输出:

Array[Long] = Array(20090216, 20090711)

您可能需要在Try中对此进行保护,以确保不会出现例外情况。

编辑:
如果您只希望拥有类型(Long, Long, Long)的数组,最简单的方法就是转换整个数组。现在再次,你应该将它包装在Try

val t: Array[(Any, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))
val x = t.asInstanceOf[Array[(Long, Long, Long)]]

输出:

Array[(Long, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))