2011-03-25 2 views
0

Voici mon cas: j'ai créé une table avec DefaultTableModelaccès java vecteur à deux dimensions à partir scala

Alors, quand je l'utilise getDataVector je reçois un java.util.Vector à deux dimensions.

Lorsque j'utilise toSeq ou tout autre convertisseur je reçois quelque chose comme

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

Les objets internes sont renvoyés sous forme java.lang.Object (AnyRef dans scala), et non comme des tableaux

Comment Je les convertis ou accède à leur contenu?

Voici le code pour tester

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 

Répondre

1

Ceci est une ancienne interface en Java, il retourne un Vector pré-générique (par exemple un Vector[_]). Il existe une variété de façons dont vous pourriez faire face à cela, mais on est:

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

d'abord spécifier explicitement ce que le type de retour doit être, et puis le convertir en collections Scala. Si vous préférez convertir les collections immuables, vous pouvez

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

entre autres. (Ce sont maintenant des vecteurs immuables Scala, pas java.util.Vectors.)

Si vous voulez muter les vecteurs qui ont été retournés, utilisez juste jv tel quel, et comptez sur les conversions implicites pour faire le travail pour vous .


Edit: ajouté quelques autres façons d'obtenir des collections immuables (possibles, mais je ne dirais pas qu'ils sont mieux):

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

Notez que la seconde ne fonctionne que si la table est non vide et rectangulaire.

+0

Merci beaucoup! Pourriez-vous partager d'autres moyens aussi – Konstantin

Questions connexes