2011-03-25 103 views
0

二维矢量这里是我的情况: 我创建了一个表的DefaultTableModel访问Java从斯卡拉

所以,当我使用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]) 

内的对象(Scala中AnyRef)返回java.lang.Object继承,而不是作为数组

哪有我转换它们或访问他们的内容?

这里是测试

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 

回答

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

注意,第二只工作,如果表是非空的和矩形的。

+0

非常感谢!你可以分享一些其他的方式吗? – Konstantin 2011-03-25 19:09:04