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.Je ne dis pas le contraire, je dis que je ne comprends pas comment tu fais !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.
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
