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 :

Remplissage d'un tableau


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Par défaut Remplissage d'un tableau
    Bonjour,

    J'aimerais remplir un tableau avec des angles que je calcule au fur et à mesure.

    J'ai déclaré ma variable et mon tableau comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float normal_angle = 0;
    edgesNormals = new float[10];
    Maintenant, que je fasse ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    edgesNormals = normal_angle;
    ou cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    edgesNormals[] = normal_angle;
    Il met l'erreur suivante:
    cannot convert from float to float[]

    Si par contre je met:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    edgesNormals[2] = normal_angle;
    Ca fonctionne.

    Ce qu'il y a, c'est que je ne sais pas à quel indice mettre l'angle, il faut le mettre à la suite de ceux déjà mis.

    Y'a-t-il une solution?

    Merci pour vos réponses

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    Le mieux est d'utiliser un java.util.ArrayList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ArrayList<Float> liste = new ArrayList<Float>(10);
    liste.add(...);
    liste.add(...);
    Si tu veux ensuite le repasser en tableau tu fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Float[] tableau = liste.toArray(new Float[0]);

  3. #3
    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,

    Citation Envoyé par Kikito
    Si tu veux ensuite le repasser en tableau tu fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Float[] tableau = liste.toArray();
    Plutôt ceci :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    Float[] tableau = liste.toArray(new Float[0]);

    a++

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    J'étais en train d'éditer quand tu as répondu, tu as bien sûr raison, le type retourné par toArray() étant du Object.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    C'est d'ailleurs bizarre/dommage que maintenant avec les générics il n'y ait pas une méthode du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public E[] toArray() {
        E[] newTab = (E[])new Object[size];
        System.arraycopy(elementData, 0, newTab, 0, size);
        return newTab;
    }
    Car là on a une création d'objet et deux tests pour rien dans 95% du temps.

  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
    Ce n'est pas possible pour deux raisons :

    • Les types génériques sont vérifié à la compilation et perdu à l'exécution.
    • Le type des tableaux ne peuvent être vérifié que pendant l'exécution.

    a++

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    J'ai peur de ne pas comprendre

    Je parle biensûr d'avoir rajouter cette fonction à la classe ArrayList, pourquoi ne serait-ce pas possible ? ton point 1 n'est pas gênant et pour ton point 2 le tableau utilisé en interne par l'ArrayList étant de type E :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     /**
         * The array buffer into which the elements of the ArrayList are stored.
         * The capacity of the ArrayList is the length of this array buffer.
         */
        private transient E[] elementData;
    On est sur de pouvoir créer un tableau de type E, sinon l'arraylist n'aurait même pas pû être crée - ils s'autorisent d'ailleurs beaucoup de warning de type "type safety" sans cette même classe.
    En fait ce que je voulais faire c'est juste un clone de la table utilisée en interne.

  8. #8
    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 Kikito
    Je parle biensûr d'avoir rajouter cette fonction à la classe ArrayList, pourquoi ne serait-ce pas possible ? ton point 1 n'est pas gênant et pour ton point 2 le tableau utilisé en interne par l'ArrayList étant de type E :
    Le type du tableau est déclaré en tant que type E[], mais en vérité il ne s'agit que d'un tableau d'objet Object[] comme tu peux le voir à l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.elementData = (E[])new Object[initialCapacity];
    Cela produit un warning car le cast vers (E[]) ne veut rien dire car E n'est pas connu à l'exécution, donc cela revient à écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.elementData = (Object[])new Object[initialCapacity];
    en déclarant elementData en tant que Object[].


    Bref en interne ArrayList utilise un Object[] mais n'y ajoute que des objet du type E via la vérification à la compilation...

    Ici le E[] sert avant tout à simplifier un peu le code et à limiter le nombre de cast...


    Le problème c'est que pour retourner un tableau du bon type, il faut connaitre ce type à l'exécution (puisque le type des tableaux est vérifié à l'exécution). Or le type des generics est perdu (à l'exécution E est remplacé par Object avec des cast implicite).

    Donc la méthode toArray() ne peut pas renvoyer le bon type de tableau car elle ne connait pas le type exact du paramétrage des générics, alors que la méthode toArray(T[]) possède cette information (le type du tableau en paramètre est récupéré).

    Ce n'est donc pas possible.
    A titre d'exemple essaye de coder la méthode suivante en renvoyant un tableau du bon type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MyClass<E> {
     
        public E[] createArray() {
            return null;
        }
     
    }
    Tu verras que ce n'est pas possible tel quel.



    Le seul moyen étant de spécifier le type de E en passant un objet de type Class en paramètre, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class MyClass<E> {
     
        private final Class<E> type;
     
        public MyClass(Class<E> type) {
            this.type = type;
        }
     
        @SuppressWarnings("unchecked")
        public E[] createArray() {
            return (E[]) Array.newInstance(this.type, 5);
        }
     
    }
    Il faut utiliser du @SuppressWarnings pour la méthode Array.newInstance() qui n'est pas generic (parce qu'elle retourne un Object et non pas un Object[]), mais ca marche...

    Par contre on est obligé de spécifier le type de E en paramètre du constructeur : cela aurait un impact énorme sur les codes existant si on devait faire cela avec les différentes collections...


    Bref les Generics ont une implémentation particulière basé sur le type-erasure (effacement du type -- c'est à dire qu'à l'exécution on utilise le type de base et non pas le type spécifique comme avec d'autre langage), avec leurs défauts et leurs avantages : Les Generics ne sont pas des Templates comme les autres !


    Toutefois, il existe une RFE pour "supprimer" le type-erasure des generics, ce qui pourrait permettre de faire des chose du tyle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public E[] createArray() {
            return new E[5];
        }
    http://bugs.sun.com/bugdatabase/view...bug_id=5098163


    a++

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Par défaut
    Merci pour ta réponse, très intéressant.

    Sinon il pourrait y avoir le moyen de récupérer le type d'un des éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public E[] toArray() {
        if (size==0){
        	return null;
        }
        E[] newTab = (E[])java.lang.reflect.Array.
                            newInstance(elementData[0].getClass(), size);
        System.arraycopy(elementData, 0, newTab, 0, size);
        return newTab;
    }
    Mais c'est vrai que c'est pas très propre et qu'on est obligé de renvoyer null ou de lancer une exception si l'arraylist est vide.

  10. #10
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par adiGuba
    [/B]Toutefois, il existe une RFE pour "supprimer" le type-erasure des generics, ce qui pourrait permettre de faire des chose du tyle :
    [/COLOR][/SIZE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public E[] createArray() {
            return new E[5];
        }
    Tu peux expliquer un peu?

  11. #11
    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 Kikito
    Mais c'est vrai que c'est pas très propre et qu'on est obligé de renvoyer null ou de lancer une exception si l'arraylist est vide.
    Le problème c'est surtout que le type du tableau pourrait être différent du type de l'ArrayList, puisque le premier élément pourrait très bien être un type fils...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            List<Number> list = new ArrayList<Number>();
            list.add(new Double(0.0));
     
            Number[] n = list.toArray(); // retournerai un Double[]


    Citation Envoyé par ®om
    Tu peux expliquer un peu?
    J'ai donné le lien : http://bugs.sun.com/bugdatabase/view...bug_id=5098163

    Le status est en RFE, cela signifie que c'est à l'étude... par contre rien ne certifie que ce sera vraiment le cas un jour (c'est juste à l'étude).


    a++

Discussions similaires

  1. [HashMap] lecture d'1 hasmap et remplissage d'un tableau
    Par _KB_ dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 30/06/2006, 19h33
  2. [VBA-E] eviter blanc remplissage listbox avec tableau
    Par chmod777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/04/2006, 12h16
  3. [LG]Remplissage d'un tableau
    Par luno2545 dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2004, 21h47
  4. Réponses: 13
    Dernier message: 14/10/2003, 14h31
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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