2012-04-15 7 views

ответ

6

Проблема в том, что t.values.toArrayjava.util.Collection уже есть метод toArray(), поэтому она возвращает Integer[], который выглядит как Array[AnyRef] в Scala. Если бы у Java не было такого метода, то неявное в JavaConversions должно было ударить и скрыть его до Iterable[Int] до создания массива. Таким образом, вы можете вызвать Coversion явно или дать тип подсказки:

import collection.JavaConversions._  

(t.values: Iterable[Int]).toArray 

или альтернативно

import collection.JavaConverters._ 

t.values.asScala.toArray 

На моей машине они являются более дважды примерно в 30 раз быстрее, чем с помощью toMap, для 1000-entry TreeMap.

+1

Другим трюком, вместо того, чтобы использовать подсказку типа, чтобы заставить его выполнять неявное преобразование в 'Iterable [Int]', было бы явно указывать неявный аргумент ClassManifest: 't.values.toArray (manifest [Int])' –

1
import collection.JavaConversions._ 

val treemap = new java.util.TreeMap[Long, Int]() 
treemap.put(1,1) 
treemap.put(2,2) 

treemap.toMap.values.toArray // res0: Array[Int] = Array(1, 2) 

Это превращает TreeMap к Скале Map, получает значения, и преобразует их в Array.

К сожалению treemap.values.toArray не делает трюк, потому что неявное преобразование из java.util.Collection[Int] при вызове .toArray дает Вам Array[Object].

+0

Это дает вам массив объектов, а не массив целых чисел – Ken

+0

@Ken, я только что исправил его. – dhg

2

Я никогда не работал с Scala, но в Java вы использовали метод Collection.toArray(), чтобы получить int [].

Надеюсь, это поможет.

С уважением.

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