【发布时间】:2012-04-15 23:09:00
【问题描述】:
我在 Scala 中有一个 java.util.Treemap[Long, Int]。我需要做的是将 Treemap 中的值转换为 Array[Int]。
我可以从TreeMap 获得Iterator[Int] 或Collection[Int],但我不确定如何将它们转换为Array[Int]。
任何建议将不胜感激。
【问题讨论】:
我在 Scala 中有一个 java.util.Treemap[Long, Int]。我需要做的是将 Treemap 中的值转换为 Array[Int]。
我可以从TreeMap 获得Iterator[Int] 或Collection[Int],但我不确定如何将它们转换为Array[Int]。
任何建议将不胜感激。
【问题讨论】:
t.values.toArray 的问题在于java.util.Collection 已经有一个toArray() 方法,这就是为什么它返回一个Integer[] 看起来像一个Array[AnyRef] 给Scala。如果 Java 没有这样的方法,JavaConversions 中的隐式函数会在构建数组之前将其转换为 Iterable[Int]。因此,您可以显式调用覆盖或给出类型提示:
import collection.JavaConversions._
(t.values: Iterable[Int]).toArray
或者
import collection.JavaConverters._
t.values.asScala.toArray
在我的机器上,对于 1000 个条目的 TreeMap,这些速度是使用 toMap 的 两倍以上 大约 30 倍。
【讨论】:
Iterable[Int] 的隐式转换是显式提供隐式 ClassManifest 参数:t.values.toArray(manifest[Int])
我从未使用过 Scala,但在 Java 中,您可以使用 Collection.toArray() 方法来获取 int[]。
希望对你有所帮助。
问候。
【讨论】:
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 转换为scala Map,获取值并将它们转换为Array。
不幸的是,treemap.values.toArray 不能解决问题,因为当您调用 .toArray 时,从 java.util.Collection[Int] 的隐式转换会返回 Array[Object]。
【讨论】: