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

Collection et Stream Java Discussion :

Créer un ArrayList de plusieurs types


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut Créer un ArrayList de plusieurs types
    Bonjour,

    J'ai une Liste<Object[]> et je veux faire le cast de cette liste d'une façon que j'aurai toujours le 1er élement du tableau de type String et le 2eme élemet du tableau de type float, aprés une recherche sur internet les développeurs font une class qui contient deux attributs qui ont de type String, float
    puis ils remplissent les paramétres de l'objet par les éléments du tableau;
    j'ai une difficulté de le faire d'avoir une AarrayList de deux types

    pouvez vous me dire comment

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord dans un tableau de type Object[] et de dimension 2, on peut toujours mettre un String dans le premier élément et un Float dans le second, ou n'importe quelle instance de n'importe quelle classe d'ailleurs, toute classe étendant Object. Mais on ne peut pas déclarer un tableau dont chaque élément est de type différent : c'est la définition même d'un tableau, que tous les éléments sont vu avec le même type. Mais le type du tableau et la classe des instances dans le tableau sont deux choses différentes : tant que la classe de l'instance est la classe des éléments du tableau, ou une classe qui étend directement ou indirectement (une classe qui étend une classe qui étend ...). Mais, je ne comprends pas ce que le cast de la List vient faire dans l'histoire : un cast permet juste d'adapter le type d'une instance à un autre type compatible (étendant le premier), comme dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object[] array1 = new Integer[]{1, 2, 3};
    for(Integer value : (Integer[])array1) {
        System.out.println(value * 10);
    }
    Ou le cast est utile pour que value soit Integer (ce qui est possible parce que le tableau est Integer[]).

    Mais il n'y a aucun moyen de caster le tableau suivant en quoique ce soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array1 = new Object[]{"toto", 1f};
    puisque c'est un Object[] (on ne peut le caster qu'en Object[], ce qui n'a aucun intérêt).

    Et puisque les 2 valeurs sont de classes différentes, dont aucune n'étant l'autre, on ne peut que faire un Object[].

    Si on avait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array1 = new Object[]{1d, 1f};
    On pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array1 = new Number[]{1d, 1f};
    parce que les classes Float et Double étendent toutes les deux Number

    On pourrait écrire également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array1 = new Number[]{1d, 1d};
    Mais on ne pourrait pas écrire ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Double value : (Double[])array1) { // class cast exception : un tableau de Number n'est pas un tableau de Double, même s'il contient que des Double
       System.out.println(value * 10);
    }

    De la même façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object[] array1 = new Number[]{1d, 1f};
    for(Double value : (Double[])array1) { // class cast exception : un tableau de Number n'est pas un tableau de Double
       System.out.println(value * 10);
    }
    de même qu'on pourrait pas plus écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object[] array1 = new Number[]{1d, 1f};
    for(Object value : array1) { 
       System.out.println(((Double)value) * 10); // class cast exception sur le second item : un Float n'est pas un Double
    }
    ni plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array1 = new Float[]{1d, 1f}; // 1d est un double pas un float
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array1 = new Double[]{1d, 1f}; // 1f est un float pas un double

    Ceci étant dit : il ne faut pas oublier que Java est un langage orienté objet et qu'on peut faire des classes. Pourquoi chercher à vouloir stocker des données de types différents dans des tableaux, alors qu'on peut le faire dans une classe de manière. Un tableau est fait pour traiter et stocker des données de même type et les traiter par itération.

    Si tu fais une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Exemple {
         public String text;
         public Float nombre;
    }
    On peut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Exemple> list = new ArrayList<>();
    list.add(exemple);
    String machin = list.get(0).text;
    float truc = list.get(0).nombre;
    Et dans cette liste on peut stocker des exemples, avec un attribut de type String, et un de type Float. Ce qui te permet de les traiter en tant qu'instance d'une classe adaptée à leur gestion.

    Si, pour un traitement en particulier, tu as besoin absolument d'avoir un tableau, tu peux toujours faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Exemple {
     
       public String text;
       public Float nombre;
     
       public Object[] toArray() {for(
           return new Object[]{text, nombre};
       }
     
    }
    Et tu appelles toArray() quand tu as besoin du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Exemple> list = ...
    for(Exemple item : list) {
        method(item.toArray());
    }
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void method(Object[] array) {...}
    Et si à l'inverse tu as en entrée un Object[] dont la première valeur est un String et la seconde un Float, tu ne pourras qu'écrire quelque chose comme ça (d'ailleurs, tu peux voir tous les contrôles qu'on doit faire, à cause de la permissivité de Object[], si on veut être sûr qu'il n'y ait pas d'erreur, et qui montre qu'une classe avec des attributs typés est beaucoup mieux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Exemple createExemple(Object[] array) {
    if ( array==null || array.length<2 ) throw new IllegalArgumentException();
    if ( (array[0]== null || array[0] instanceof String) && (array[I]==null || array[1] instanceof Float ) {
        Exemple exemple = new Exemple();
        exemple.text = (String)array[0];
        exemple.nombre=(Float)array[1];
        return exemple;
    }
    else {
       throw new IllegalArgumentException();
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par fetano Voir le message
    aprés une recherche sur internet les développeurs font une class qui contient deux attributs qui ont de type String, float
    Oui, c'est un peu à ça que ça sert, les classes dans un langage à typage statique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    Merci joel drigo pour votre super explication et thelvin pour votre confirmation c'est trés intéressant;

    j'essaye avec ce code afin de me retourne une List d'objets convertis aus types souhaités
    mais quand je fais le debug l'objet qui veint d'etre inséré ecrase l'objet précedent voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    List<Object[]> list = {......} // liste de tableau de deux éléments
     
    		ConvertObject obj = new ConvertObject(); // instanciation de la classe qui contient les deux attributs avec types souhaités
     
    		 for (Object[]  ligneRes: list){
    			 if ( ligneRes==null || ligneRes.length<2 ) throw new IllegalArgumentException();
    			 if ( (ligneRes[0]== null || ligneRes[0] instanceof Date) && (ligneRes[1]==null || ligneRes[1] instanceof Float) ){
     
                	obj.setDateVal((Date)ligneRes[0]);
                	obj.setFloatVal((Float)ligneRes[1]);
    			 }
                	listConvertObj.add(obj); // ici je veux insérer mes objets convertis dans une liste afin d'une autre manipulation aprés
                }
    est -il correct?
    merci d'avance

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il faut que tu utilises une instance différente de ConvertObject pour chaque item de ta List (que tu stockes dans une List<ConvertObject>).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    ça veut dire on fait une nouvelle instanciation pour chaque itération de la boucle for
    on construit l'objet et on insére dans la liste ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     for (Object[]  ligneRes: list){
    			 if ( ligneRes==null || ligneRes.length<2 ) throw new IllegalArgumentException();
    			 if ( (ligneRes[0]== null || ligneRes[0] instanceof Date) && (ligneRes[1]==null || ligneRes[1] instanceof Float) ){
    				ConvertObject obj = new ConvertObject(); //l'instanciation de l'objet se fait dans la boucle for ??
                	obj.setDateVal((Date)ligneRes[0]);
                	obj.setFloatVal((Float)ligneRes[1]);
    			 }
                	listConvertObj.add(obj;
                }

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Exactement.

    (sauf pour le index dans listConvertObj.add(index, element) qui normalement n'est pas nécessaire, mais surtout qui peu planter en fonction de la valeur de index et de la taille de la liste, et c'est obj la variable) : utilises simplement listConvertObj.add(obj).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    ok merci pour votre explication

    pour les indexes j'ai modifé le message

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    oui les données sont insérées et j'ai construit mon arrayList avec deux types différents
    merci bcp , seulement j'ai une remarque quand je fais le debug
    je vois ma liste avec 9 cellules : les deux premiers cellules sont remplies par les objets convertis et les autres sont à null
    ce qui est étrange car je fais dans ma boucle le traitement quand la cellule est à null il n'insére pas et size 2
    quand je veux faire la manipulation sur cette liste une severe exception dans index 2 size 2

    comment je dois régler ce probléme

    merci

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Mais il y a combien de tableaux dans ta liste d'origine (ligneRes) ? 2 à priori ? Ou plus ?

    S'il y en a bien 2, c'est normal qu'il y en ai que 2 dans l'ArrayList. Le tableau interne que tu vois dans l'ArrayList en debug est un tableau utilisé pour le stockage interne : à part par curiosité personnelle, tu n'as pas à t'en préoccuper (Ce tableau peut être plus grand que le nombre d'éléments stockés, normalement 10 par défaut, et pas 9). Et la méthode size() de l'ArrayList retourne bien 2, le nombre d'éléments dans la liste : en interne, les cellules inoccupées contiennent null et tu n'as pas à t'en soucier : de toute manière, elles te sont inaccessibles de l'extérieur de l'ArrayList. Et si tu accèdes à un index supérieure ou égale à la taille, les index allant de 0 à taille-1, tu obtiens une ArrayIndexOutOfBoundException et c'est tout à fait normal.

    S'il y a plus de 2 tableaux dans ligneRes, alors il y a un problème quelque part dans ton code de conversion : redonnes-nous le dans ce cas. Et le code où tu obtiens l'exception.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 106
    Points : 38
    Points
    38
    Par défaut
    merci joel drigo pour votre aide
    vous avez raison'ai une faute dans mon code, j'ai mis dans la boucle for <= list ce qui résulte une exception; il faut < list

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

Discussions similaires

  1. [VB6] Spécifier plusieurs types de fichiers avec FileSearch
    Par yaya54 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 31/01/2008, 15h59
  2. [Struts] Afficher une ArrayList sur plusieurs pages
    Par tshupaka dans le forum Struts 1
    Réponses: 5
    Dernier message: 18/03/2006, 17h21
  3. Créer un jeu avec plusieurs langages
    Par spidouille dans le forum Pascal
    Réponses: 6
    Dernier message: 04/10/2005, 14h07
  4. [HTML/CSS] Plusieurs types de liens.
    Par will-scs dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/08/2005, 17h12
  5. Renvoyer un OUTPUT de plusieurs types
    Par omlip dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/08/2004, 10h44

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