Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de généricité

liste dynamique pouvant contenir différents objets

Sujet résolu
    3 septembre 2016 à 14:17:15

    Bonjour,

    Je participe actuellement à un projet pour un concours et je dois réaliser une classe permettant de créer des listes de longueur variable. Ce petit programme pas très optimisé marche pour des listes d'entiers. Cependant ces listes doivent, par la suite, pouvoir contenir toutes sortes d'objets et c'est là que mes compétences s’arrêtent.

    Pouvez vous m'aider et m'expliquer comment faire pour régler ce problème s'il vous plaît ?

    Voici le programme :

    public class PList {
        //liste a taille dynamique
        private int list[] = new int[100];
        private int indice = 0;
       

        public int[] add(){
            //ajoute 100 emplacements suplémentaires a la liste
            int temp[] = new int[indice+100];
            for(int i = 0; i < indice; i++){
                temp[i] = list[i];
            }
            int L[] = new int[indice+100];
            for(int i = 0; i < indice; i++){
                L[i] = L[i];
            }
            System.out.println("fct \"add\": Used !");
            return L;
        }
       
        public void append(int val){
            //ajoute un élément a la fin de la liste
            if(indice == list.length-1){list = add();}
            list[indice] = val;
            indice++;
        }
       
        public void insert(int n, int val){
            //insert un élément a l'emplacement indiqué
            if(indice == list.length-1){list = add();}
            for(int i = indice; i >= n; i = i-1){
                list[i+1]=list[i];
            }
            list[n]=val;
            indice++;
        }
       
        public int size(){
            //retourne la taille de la liste
            return indice;
        }
       
        public int pop(int n){
            //supprime l'élément a l'emplacement indiqué et le retourne
            int x;
            if (indice != 0 && 0 <= n && n < indice){
                x = list[n];
                for(int i = n; i < indice; i++){
                    list[i]=list[i+1];
                }
                indice = indice-1;
            }else{
                System.out.println("indice hors limite ou liste vide, 0 retourné");
                x = 0;
            }
            return x;
        }
       
        public void supress(int n){
            //supprime l'élément a l'emplacement indiqué sans le retourner
            if (indice != 0 && 0 <= n && n < indice){
                for(int i = n; i < indice; i++){
                    list[i]=list[i+1];
                    indice = indice-1;
                }
            }else{System.out.println("Indice hors limite");}
        }
       
        public int peek(int n){
            //retourne l'élément a l'emplacement indiqué
            if(0 <= 0 && n < indice){
                return list[n];
            }else{
                System.out.println("indice hors limite, 0 retourné");
                return 0;
            }
        }
       
        public static void main(String[] args){
            //PList L = new PList();
            //for(int i = 0; i < 347; i++){L.append(1);}
            //System.out.println(L.size());
        }
    }

    -
    Edité par Lagiacrus9 3 septembre 2016 à 14:17:38

    • Partager sur Facebook
    • Partager sur Twitter
      3 septembre 2016 à 17:56:40

      Bonjour.

      Déjà, quel est ton problème ? 

      Le seul soucis que tu auras en utilisant un tableau c'est qu'il n'est pas possible de définir un tableau d'un type générique.
      La solution est d'utiliser un tableau d'Object. C'est ce qui est fait dans la classe ArrayList si tu es curieux.

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        6 septembre 2016 à 16:16:17

        Si tu veux trier une liste d'élément de n'importe quel type, je te conseille de t'orienter vers les templates.

        public abstract class PList<T extends Comparable<T>> implements Collection<T> {
        
        }



        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2016 à 23:43:05

          Il m'a fallu un long moment pour revenir sur ce sujet car le cas de la généricité que je recherche demande beaucoup de temps.

          Or je n'en ai pas tant que ça (je suis en math spé).

          Ce que je cherche a faire est une liste d'objet défini lors de l'instanciation de la classe.

          Par exemple : une liste de int, une liste de String ou une liste de double[][].

          Je me retrouve alors dans la situation où la classe accepte "<T>" : public class PList<T>{

          mais je n'arrive pas a instancier une liste d'éléments de type <T>.

          J'ai essayé : private list = new T[100]; mais cela n'a pas marché.

                              private T[] list; et ceci marche mais n'a pas 100 emplacements.

          -
          Edité par Lagiacrus9 22 septembre 2016 à 23:55:02

          • Partager sur Facebook
          • Partager sur Twitter
            23 septembre 2016 à 0:38:12

            Bonjour,

            Comme le dit Pinguet, le seul moyen (pas très beau, mais qui marche), c'est de créer un tableau d'Object et de faire un cast en T[].

            • Partager sur Facebook
            • Partager sur Twitter
              23 septembre 2016 à 17:51:57

              brubru777 a écrit:

              créer un tableau d'Object et de faire un cast en T[].

              En ecrivant ceci : private T[] list = (T[]) new Object[100]; ma classe fonctionne.

              Pour autant, lorsque j'écris PList<Integer> list = new PList<Integer>(); il me réponds : Cannot instantiate the type PList<Integer>

              Je suis désolé, je ne connais pas l'exacte syntaxe, pourriez-vous me l'indiquer s'il vous plait ?

              • Partager sur Facebook
              • Partager sur Twitter
                23 septembre 2016 à 20:07:41

                PList<Truc> ma_liste = new PListe<Truc>();
                // ajouter un élément 
                ma_liste.add(new Truc());
                • Partager sur Facebook
                • Partager sur Twitter
                  24 septembre 2016 à 0:03:44

                  Tout marche à merveille !

                  Je vous remercier énormément !

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème de généricité

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown