java - 从scala访问java二维 vector

标签 java scala vector multidimensional-array

这是我的案例: 我使用 DefaultTableModel 创建了一个表

因此,当我使用 getDataVector 时,我得到一个二维 java.util.Vector。

当我使用 toSeq 或任何其他转换器时,我会得到类似的内容

Buffer([5.0, 1.0, 50.0], [10.0, 1.5, 40.0], [2.0, 1.5, 90.0], [1.0, 1.0, 100.0], [6.0, 3.0, 100.0], [16.0, 3.5, 50.0])

内部对象以 java.lang.Object(scala 中的 AnyRef)形式返回,而不是以数组形式返回

我如何转换它们或访问它们的内容?

这是要测试的代码

 import collection.mutable.{Buffer, ArrayBuffer}
 import javax.swing.table._
 import scala.collection.JavaConversions._

 var data = Array(
             Array("5.0", "1.0", "50.0"),
             Array("10.0", "1.5", "40.0"),
             Array("2.0", "1.5", "90.0"),
             Array("1.0", "1.0", "100.0"),
             Array("6.0", "3.0", "100.0"),
             Array("16.0", "3.5", "50.0"))


 val names = Array("K¹", "K²", "K³")

 val m = new DefaultTableModel(data.asInstanceOf[Array[Array[AnyRef]]], names.asInstanceOf[Array[AnyRef]])

 val t = m.getDataVector.toSeq

最佳答案

这是 Java 中的较旧接口(interface),因此它返回一个预通用 Vector(即 Vector[_])。有多种方法可以解决这个问题,但其中一种是:

val jv = m.getDataVector.asInstanceOf[java.util.Vector[java.util.Vector[AnyRef]]]
val sv = jv.map(_.toSeq)

首先显式指定返回类型应该是什么,然后将其转换为 Scala 集合。如果您希望转换为不可变集合,您可以

val sv = Vector() ++ jv.map(Vector() ++ _)

除其他外。 (这些现在是 Scala 不可变 vector ,而不是 java.util.Vector。)

如果您想改变返回的 vector ,只需按原样使用 jv ,并依靠隐式转换来为您完成这项工作。

<小时/>

编辑:添加了其他几种获取不可变集合的方法(可能,但我不会说它们更好):

val sv = List(jv.map(v => List(v: _*)): _*)
val sv = Vector.tabulate(jv.length,jv(0).length)((i,j) => jv(i)(j))

请注意,第二个仅在表格非空且为矩形时才有效。

关于java - 从scala访问java二维 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5436323/

相关文章:

java - 如何在 LibGDX 主体中删除?

java - 找出前N个最流行的元素

Scala Quasiquote 提升

c++ - 如何使用 map vector

c++ - 重新排序 vector<std::unique_ptr<X>> 给定 vector<const X*>

java - Android:持续内存消耗/dumpGfxInfo()

java - 如何将字符串值从一个 servlet 传递到另一个 servlet?

python - 跟踪 scala 中方法的执行情况

scala - 如何在Scala中为任何Traversable实现通用算法?

c++ - 使用单独编译时返回 typedef 类型