IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Réorganisation manuelle d'un objet de type List<T>


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut Réorganisation manuelle d'un objet de type List<T>
    Bonjour à tous !

    J'ai une List<T> et je souhaite pouvoir réorganiser les éléments à l'intérieur.
    J'affiche cette liste dans une JList et à droite j'ai un bouton "Monter" et un bouton "Descendre".

    Au début je pensais que c'était simple mais l'opération s'avère particulièrement compliquée...
    En effet, si je souhaite monter un élément dans la liste je dois diminuer son index et ajouter 1 à l'index de tous les éléments susceptibles d'être modiifés par ce changement. Ce qui pose problème justement c'est d'itérer sur la liste et de modifier les index pendant cette itération, la liste comprend plus rien et j'ai tout un tas d'exception.

    Il existe une méthode add() qui prend un integer pour spécifier l'emplacement du nouvel élément dans la liste et qui s'occupe de réorganiser correctement les index des autres éléments, pourquoi ne pas avoir fait une telle fonction pour permettre non pas d'ajouter un nouvel élément mais de déplacer un élément existant à l'intérieur de la liste ?

    Si vous avez déjà été confronté à ce problème j'aurais bien besoin d'une petit coup de main
    Je vous remercie d'avance !

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Déplacer un élément revient à le supprimer et à l'insérer au bon endroit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    List<Object> l = ...;
    ...
     
    Object o = l.remove(4);
    l.add(2,o);
    ...


    PS: il faut cloner la liste si l'on veut à la fois la parcourir et la modifier en même temps

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Merci pour cette réponse

    Je m'en veux de ne pas y avoir pensé moi-même

    J'avais peur que ça pose des problèmes à Hibernate et son Dirty Checking (la liste est persistée en base de donnée) mais non

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il n'y a même pas besoin de le supprimer, il suffit simplement de faire une simple inversion. Cela se fait en trois petite ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public static <T> void invert(List<T> list, int indexA, int indexB) {
    		T tmp = list.get(indexA);
    		list.set(indexA, list.get(indexB));
    		list.set(indexB, tmp);
    	}
    Après on peut bien sûr se faire des méthodes plus adéquates selon les cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public static <T> void moveUp(List<T> list, int index) {
    		invert(list, index, index-1);
    	}
     
    	public static <T> void moveDown(List<T> list, int index) {
    		invert(list, index, index+1);
    	}
    a++

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Ok mais fonctionnellement, permutter et déplacer ce n'est pas pareil...

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Ok mais fonctionnellement, permutter et déplacer ce n'est pas pareil...
    Ca l'est lorsqu'on manipule des emplacements juxtaposés

    a++

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Rien n'indiquant que la liste est une ArrayList, on pourrait avoir des performances assez catastrophiques si la liste est longue et qu'elle est une LinkedList.

    Dans ce cas, il est peut-être intéressant de jouer avec des ListIterator.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Objet de type list<T>
    Par stefvat dans le forum ASP.NET
    Réponses: 7
    Dernier message: 14/04/2009, 12h01
  2. Rediriger un objet de type List d'une servlet à un Jsp
    Par Smix007 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 21/03/2007, 11h46
  3. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  4. Réponses: 3
    Dernier message: 02/05/2006, 15h12
  5. [Threads]liste de mes objets de types threads
    Par comme de bien entendu dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 22/03/2006, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo