这是我的情况: 我用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
答案 0 :(得分:1)
这是Java中较旧的接口,因此它返回一个预先通用的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不可变向量,而不是java.util.Vectors。)
如果你想改变返回的向量,只需按原样使用jv,并依靠隐式转换为你完成工作。
编辑:添加了几个其他方法来获取不可变的集合(可能,但我不会说它们更好):
val sv = List(jv.map(v => List(v: _*)): _*)
val sv = Vector.tabulate(jv.length,jv(0).length)((i,j) => jv(i)(j))
请注意,第二个仅在表非空且矩形时才有效。