доступ к Java-двумерный вектор из Scala - PullRequest
0 голосов
/ 25 марта 2011

Вот мой случай: я создал таблицу с 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 (AnyRef в scala), а не как массивы

Как я могу преобразовать их или получить доступ к их содержимому?

Вот код для проверки

 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 Ответ

1 голос
/ 25 марта 2011

Это более старый интерфейс в 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))

Обратите внимание, чтовторая работает только в том случае, если таблица непустая и прямоугольная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...