L'utilisation d'une HashMap pour un model de table est tr�s utile lorsque les donn�es sont "creuses", c'est � dire qu'une proportion non n�gligeable des cases d'un tableau 2D sont vides (null). C'est la technique utilis�e par exemple dans le tableur open-source dont j'ai oubli� le nom:

private class MatrixTableModel extends AbstractTableModel
{
private Hashtable _cellValues;
private int _size;

public MatrixTableModel (int size)
{
_size = size;
_cellValues = new Hashtable ();
}

public Object getValueAt (int row, int column)
{
return _cellValues.get(new MatrixElement(row, column));
}

public void setValueAt (Object value, int row, int column)
{
MatrixElement cell = new MatrixElement(row, column);

if (value == null || "".equals (value))
_cellValues.remove(cell);
else
_cellValues.put(cell, value);
...
}

...
}

Avec chaque "case" repr�sent�e par un objet MatrixElement cod� ainsi:

private class MatrixElement implements Serializable
{
private int _row;
private int _column;

public MatrixElement (int row, int column)
{
_row = row;
_column = column;
}

public final int getRow()
{ return _row; }

public final int getColumn()
{ return _column; }

public int hashCode()
{
return (_row % 0xFFFF) | ((_column % 0xFFFF) << 16);
}

public String toString ()
{
return _row + " " + _column;
}

...
}

L'int�r�t est que tu ne d�clare un objet MatrixElement que si une case doit �tre remplie; dans ce cas tu associes une valeur � cette objet (l'objet repr�sente donc la localisation de cette valeur dans un "tableau virtuel") dans le Hashtable. Le MatrixElement a pour seul r�le de convertir les demandes de positions d'une case en un hash code exploitable par la Hashtable.

Aur�lien Mazurie


Le jeudi, 23 jan 2003, � 13:12 Europe/Paris, Herve AGNOUX a �crit :

Le Jeudi 23 Janvier 2003 11:54, OLIVIER CAYRON a �crit :
La dessus, mon avis est que l'organisation des classes graphiques
ne sera jamais un mod�le pur et qu'il faudra toujours plus ou
moins optimiser, ... Mais j'ai peut-�tre tort.

En tous cas pour Java je suis tout � fait d'accord avec toi.


L'erreur (par exemple pour les TableModel) se situe souvent dans le
cas o� on cr�e des objets dans le getValueAt.
Sinon, d'exp�rience, je t'assure qu'utiliser des HashMap dans le
getValueAt pour r�cup�rer les valeurs fonctionne tr�s bien, m�me
avec beaucoup de donn�es.

Je ne dis pas le contraire, je dis que je ne comprends pas comment tu fais !

getValueAt te donnes comme param�tres deux entiers : le rang, la colonne. Moi,
� partir de la colonne, je d�couvre l'endroit o� j'ai cas� les objets de
cette colonne ; en g�n�ral, tous les objets d'une colonne ont la m�me classe
et sont rang�s dans un truc style ArrayList. Et avec le rang, j'ai l'objet
dans le ArrayList. Et j'ai pas besoin de HashMap. Et comme j'ai �goistement
tendance � penser que tout le monde fait comme moi, je comprends pas pourquoi
tu utilises un HashMap :-) !


--
SARL diaam informatique - 04 50 77 12 60
Ingenierie, d�veloppements de syst�mes d'information
http://www.diaam-informatique.com






Répondre à