2016-01-30 8 views
0

Как я могу преобразовать следующий массив к одному из типов массива [(Long, Long, Long)]Изменить тип элемента массива

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

Я попытался отображение первого элемента test.map(x => (x._1).toLong)

но Я получаю

error: value toLong is not a member of Any

+0

Возможный дубликат и решение: http://stackoverflow.com/a/11716183/4105457 – Flown

ответ

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)} 

Хотя бывший немного более лаконична, последний дает вам дополнительные possibilites. Например, можно использовать метод collect, удаляя элементы, которые вы не можете преобразовать, или вы можете обрабатывать различные типы значений, скажем, BigInt и BigInteger:

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

(Примечание: этот код будет возвращать фиктивные значения, если BigInts на самом деле не вписываются в длинные, поэтому следует проверить это в производственном коде.)

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, чтобы убедиться, что вы не получаете литья исключений.

Edit:
Если вы только хотите иметь массив типа (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)) 
+0

* Плохая идея *. Обертка приведения в 'Try {}' не поможет, потому что операция литья «преуспевает» из-за стирания, независимо от того, есть ли на самом деле * Longs в этом кортеже. Массив не знает во время выполнения, каковы типы элементов кортежа, он знает, что он имеет дело с некоторыми Tuple3. Поэтому, когда вы бросаете, он просто игнорирует параметры типа Tuple3 и надеется на лучшее. 'Try {(1, 2l, 3l) .asInstanceOf [(Long, Long, Long)]} .toOption.map (_._ 1)' не будет оценивать значение 'None', но приведет к исключению ClassCastException. –

Смежные вопросы