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

Langage Java Discussion :

Insertion dans un indice spécifique pour une Collection


Sujet :

Langage Java

  1. #1
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut Insertion dans un indice spécifique pour une Collection
    Bonjour,

    Est ce qu'il y'a un moyen qui permet d'insérer un Object dans une ArrayListe ou autre, dans une indice quelconque.


    Par exemple je veux insérer un String "A" dans l'indice 3 par exemple,alors que les 3 indices précédent (0,1,2) sont vide.:
    ça me retourne une erreur OutOfBound.

    Est ce qu'il y'a un moyen de faire cela pour une collection ?

    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 24
    Par défaut
    Si il te retourne une erreur outOfBounds, c'est que tu as mal spécifié la taille de ton ArrayList au début.

    Si tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList liste = new ArrayList(15)
    ça devrait mieux fonctionner.
    Maintenant, est-ce que tu sais combien tu auras de valeurs à ajouter ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Bonjour,

    Non ce n'est pas possible aussi facilement, la capacité initialie d'une liste, ne correspond pas à la taille de la liste.
    Le principe d'une ArrayList est d'ajouter les éléments au fur et à mesure dans la liste sans sauter d'indice.
    Il est possible de la faire en faisant une classe qui hérite de ArrayList et de surcharger la méthode d'ajout.

    Pour la deuxième question, une Collection permet uniquement d'accéder aux données et non d'en ajouter.

  4. #4
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Bonjour,

    La réponse donnée par Quintouch est fausse dans la mesure où les Arraylist renvoient ce type d'exception lorsque l'indice renseigné est < 0 ou > à la taille (size).
    Or créer une Arraylist avec une capacité initiale assure que l'objet aura un tableau de la taille renseignée, ce qui améliore les performances à l'ajout d'éléments par exemple car on peut écrire directement dans le tableau sans avoir à en recréer un de taille supérieure.
    Cette instanciation avec une capacité initiale n'interfere cependant pas sur l'attribut size. Du coup, l'exception sera toujours renvoyée.

    Pour faire ce que tu veux faire, il est peut etre préférable d'utiliser une HashMap. Ca parrait plus correspondre à tes besoins.

  5. #5
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    Merci pour vos réponses,

    Effectivement HashMap permet de faire ce traitement là, Merci pour l'information.

    Par contre je pense que je doit obligatoirement passer par un Object ArrayList puisque je travaille avec un framework j2ee qui permet d'afficher un select html dynamique, j'ai essayer de lui envoyer un objet HashMap mais il ne l'a pas accepter.

    eric39 propose de redéfinir la méthode add d'ArrayList, est ce que à votre avis c'est nécessaire? si oui est ce que vous pouvez me donner des pistes ?

    Merci.

  6. #6
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Peux tu etre plus precis sur ce que tu souhaites faire exactement pour tenir à avoir une paire clé -> valeur ? Pourquoi dois tu avoir absolument ce type de rangement ?

    Ce qui explique surement le non fonctionnement avec les HashMap, c'est qu'au pendant des List, les Map n'implémentent pas Collection.
    Redéfinir le fonctionnement de la classe ArrayList n'est peut etre pas non plus une idée, si la contrainte sur les index a été mise en place, c'est qu'il y a des raisons, essayer de la contourner pourrait meme poser des problèmes de fonctionnement de ta classe (securité, erreurs, performances...).
    Tu peux par contre toujours réaliser ta propre implémentation de List...
    C'est pour ces raisons qu'il est important que tu nous expliques où tu veux en venir car il y a peut etre aussi un problème de conception de ta part et d'autres solutions pourraient etre plus simple à mettre en oeuvre.

  7. #7
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 679
    Par défaut
    eric39 propose de redéfinir la méthode add d'ArrayList, est ce que à votre avis c'est nécessaire? si oui est ce que vous pouvez me donner des pistes ?
    c'est envisageable en effet tu pourais faire quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ExtensibleArrayList<E> extends ArrayList<E> {
     
        @Override
        public void add(int index, E element) {
            for(int i = this.size(); i < index ;i++){
                add(null);
            }
            super.add(index, element);
        }
    }

  8. #8
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Citation Envoyé par Uther Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ExtensibleArrayList<E> extends ArrayList<E> {
     
        @Override
        public void add(int index, E element) {
            for(int i = this.size(); i < index ;i++){
                add(null);
            }
            super.add(index, element);
        }
    }
    Sauf erreure de ma part, cette implémentation est fausse.
    Pour preuve, si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            List<String> list = new ExtensibleArrayList<String>();
            list.add(3, "A");
            list.add(1, "A");
            System.out.println(list.get(3)); // => retourne null
    La méthode add(index,objet) ajoute réellement une case en plus au tableau, positionnée à l'index spécifié. Donc, la taille du tableau est augmentée de 1, avec un décalage de 1 de tous les éléments qui se trouvaient à la position index jusqu'à la fin du tableau.
    Eventuellement, il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public class ExtensibleArrayList<E> extends ArrayList<E> {
     
            @Override
            public void add(int index, E element) {
                for (int i = this.size(); i <= index; i++) {
                    add(null);
                }
                super.set(index, element);
            }
        }
    Mais pourtant, tu n'es pas sauvé car imagine faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            List<String> list = new ExtensibleArrayList<String>();
            list.add(3, "A");
            list.add(5, "A");
            System.out.println(list); // => [null, null, null, A, null, A]
            list.remove(4);
            System.out.println(list); // => [null, null, null, A, A]
            System.out.println(list.get(5));//  => IndexOutOfBoundsException
    Bref, on peut facilement se rendre compte que ce n'est absolument pas la solution.

  9. #9
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    Merci beacoup pour vos réponses, je suis entrai d'adapter la redéfinition de la méthode add à mon problème.

    Pour vous expliquer d'avantage zorm, voici plus précisément le problème :

    1. J'ai une liste que je récupère d'une base de donnée avec des identifiants qui sont dans l'ordre suivant : (33,36,37,38,9,10,11,6,42,41), je ne peux pas modifier la procédure stockée qui charge la liste.

    2. Je doit trier cette liste selon l'ordre des id suivant : (33,36,37,38,6,10,11,9,42,41), c'est une exigence du client, vous remarquer le seul changement c'est l'emplacement du 9 avec le 6, mais je ne sais peut être que ailleurs il y'aura plus que 2 changements.

    3. Affichage de la liste dans un tag qui sert à afficher un select html avec une liste d'option(la liste d'option est la liste que j'envoie en session dans me servlet ou mon action)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <tag:select name="searchForm" property="idMission">
                 <tag:options collection="%=IConst.LISTE%>"
    			property="id"
             		labelProperty="libelle" />
    </tag:select>
    désolé, je vous é mis le code de la JSP pour bien éclaircir la chose, je sais bien que c'est forum Java.

    Alors des idées ? je test toujours la redéfinition de la méthode add
    Autre précision je travail avec JDK 1.3, donc j'utilise pas de sous type ou je ne sais pas quoi son nom exactement, je parle de <E> pour les Collections.

    Merci à vous !

  10. #10
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    Merci Uther pour ta proposition, a priori ça marche, avec la modification de zorm

    Je pense que concernant cette liste je ne doit pas faire des modifications comme un remove par exemple, en tout pour le moment,

    Pourtant je me demande est ce qu'il y a une méthode plus fiable ? pour le bien de la maintenance du code ?

    Merci à vous !

  11. #11
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Citation Envoyé par aelmalki Voir le message
    Je doit trier cette liste selon l'ordre des id suivant : (33,36,37,38,6,10,11,9,42,41), c'est une exigence du client, vous remarquer le seul changement c'est l'emplacement du 9 avec le 6, mais je ne sais peut être que ailleurs il y'aura plus que 2 changements.
    Ok, je comprends, maintenant, il faudrait peut être voir avec le client s'il y a une logique de tri derrière tout cela. Ce que je veux dire, c'est savoir s'il n'y aurait pas une méthode qui permettrait d'automatiser ce tri.
    Ainsi, comme tu le soulignes, si la liste venait à changer, que le client ne soit pas obligé de vous rappeler pour que vous procuriez un patch pour changer le tri.
    Dans ce cas, il suffirait d'écrire une classe comparator et le tour est joué (Collection.sort(list,comparator))

    Sinon, je vois que tu utilises Struts si je ne me trompe pas. Le tag "options" prend effectivement une collection et l'affiche suivant l'ordre dans laquelle se trouve la liste. Du coup, il suffit juste de trier ta liste comme tu veux l'afficher avant de l'envoyer dans le formulaire. Ceci se fait donc dans la classe Action, de la facon suivante:

    1. Récupération de la liste (dans une base de données par exemple)
    2. Tri de la liste
    3. On fourni la liste triée à l'ActionForm (par un setter par exemple)

    A ce moment, tu auras bien ta liste triée dans la page web

    Citation Envoyé par aelmalki Voir le message
    j'utilise pas de sous type ou je ne sais pas quoi son nom exactement, je parle de <E> pour les Collections.
    Ce sont les génériques, apparus avec java 1.5. Voila pourquoi tu ne peux les utiliser.

    En esperant avoir répondu réellement à ton problème

  12. #12
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    Je ne sais pas quoi vous dire, Merci beaucoup, j'ai appris pas mal de chose à travers cette conversation.

    Merci beaucoup à vous tous, et excellente journée.

  13. #13
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    J'arrive après l'action,

    L'utilisation d'une Map est bonne, mais rien n'empèche de surcharger aussi les méthodes remove de ArrayList pour remplacer l'élément par null. Si la liste est utilisée uniquement pour l'affichage et n'est pas conservée ad vitam eternam.

    Dans un style approximatif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Override
    public E remove(int index) {
    	return super.set(index, null);
    }

  14. #14
    Membre éclairé Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Par défaut
    Merci eric, j'ai pris note de ta remarque...

    Je pense que je n'aurais plus besoin de trie coté Java, je vais procéder a une indexation des champs dans la base de données et le trie ce fera alors coté base de données, puisque le client le permet maintenant.

    Merci à vous !

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

Discussions similaires

  1. [Debutant]Mapping pour une collection
    Par maxattack dans le forum Hibernate
    Réponses: 14
    Dernier message: 14/06/2007, 10h59
  2. Réponses: 2
    Dernier message: 23/11/2006, 10h37
  3. Mapping spécifique pour une action spécifique
    Par santana2006 dans le forum Struts 1
    Réponses: 8
    Dernier message: 04/08/2006, 18h41
  4. Erreur dans un programme php pour une connexion à une bdd
    Par gaetan.tranvouez dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/06/2006, 21h06
  5. Protocole spécifique pour une appli client/serveur
    Par SteelBox dans le forum Développement
    Réponses: 2
    Dernier message: 17/12/2004, 11h20

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