Je suis dans une application swing, et je suis confronté à des problèmes qui concernent tous ceux qui font du swing, je vais donc partager.
Première chose, les listes dont le éléments sont triés;
J'ai actuellement une implémentation fondée sur un TreeMap :
Code :
- public class MemberSet extends AbstractListModel {
- private SortedSet model;
- // accessor used for indexed access.
- private Iterator indexedAccessIterator = null;
- /**
- * next aivable index from the iterator.
- */
- private int nextIndex = 0;
- private void reinitIterator() {
- indexedAccessIterator = null;
- nextIndex = 0;
- }
- /**
- * @param membersComparator
- */
- public MemberSet(Comparator membersComparator) {
- model = new TreeSet(membersComparator);
- }
- // ListModel methods
- public int getSize() {
- // Return the model size
- return model.size();
- }
- public Object getElementAt(int index) {
- Object result = null;
- if (indexedAccessIterator == null || nextIndex > index) {
- indexedAccessIterator = model.iterator();
- nextIndex = 0;
- }
- for (; nextIndex <= index; nextIndex++) {
- result = indexedAccessIterator.next();
- }
- return result;
- }
- public boolean add(Member element) {
- boolean added = model.add(element);
- if (added) {
- reinitIterator();
- fireContentsChanged(this, 0, getSize());
- }
- return added;
- }
- public synchronized void clear() {
- model.clear();
- reinitIterator();
- fireContentsChanged(this, 0, getSize());
- }
- public synchronized boolean remove(Member member) {
- boolean removed = model.remove(member);
- if (removed) {
- reinitIterator();
- fireContentsChanged(this, 0, getSize());
- }
- return removed;
- }
- public Iterator iterator() {
- return Collections.unmodifiableSortedSet(model).iterator();
- }
- }
|
Elle est spécialisée pour des "Member" mais bon vous avez compris le principe.
La vue (ListUI) accède aux éléments, par leur indice, avec mon TreeSet dans une main et mon int dans l'autre, il faut convertir, la solution la plus simple consiste à parcourir un itérateur du set en comptant, quand on arrive au rang voulu, on renvoie la valeur de l'itérateur. Pour faire baisser un poil la complexité, et comme je sais que les indice sont accédés par plage contigües (j'ai testé) dans l'ordre croissant, je garde l'itérateur pour pas repartir de zéro à chaque requête.
si vous avez une idée pour l'améliorer, dites.
Il est possible d'avoir une complexité encore plus faible, mais ça nécessite de refaire toute la classe TreeSet pour y rajouter l'indexation, si quelqu'un de compétent en algo et en qualité veut bien faire ça en open-source, nous lui en serions tous reconnaissants.
Dans un esprit de partage, vous qu'avez-vous comme ListModel avec des services intéressant ?
Voiloù, j'aimerais qu'on arrive un peu à partager sur ce point (et peut-être des points connexes, tel les TableModels).
edit : enlevage d'une connerie, comme quoi se laver les dents c'est utile : ça fait réfléchir.
Message édité par nraynaud le 23-12-2003 à 09:44:52
---------------
trainoo.com, c'est fini