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 :

Copier image.ppm dans liste chaînée


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut Copier image.ppm dans liste chaînée
    Bonjour à tous ,
    voici une image ppm :
    P3
    #truc.ppm
    4 4
    15
    0 0 0 0 0 0 0 0 0 15 15 0
    0 0 0 0 15 7 0 0 0 0 0 0
    0 0 0 0 0 0 0 15 7 0 0 0
    15 15 0 0 0 0 0 0 0 0 0 0
    Il faut qu'elle soit stockée dans une liste chainée de la manière suivante :
    [red][green][blue] [nombre d'occurence de la couleur]
    000 3 -----> 1500 1 -----> 000 1 -----> 0157 1 -----> 000 4 -----> 0157 1 -----> 000 1 -----> 15150 1 -----> 000 3 /

    une image doit comprendre une largeur et une hauteur ( 4 et 4 pour l'exemple si dessus )
    la valeur max d'une couleur : 15 pour cet exemple
    ainsi qu'une liste chaînée comme représentée si dessus

    je vous montre donc les classes que j'ai crée , mon problème est que je n'arrive pas à lire le fichier et mettre les informations dans ma liste chaînée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class Image {
     
    	private int largeur , hauteur ;
    	private int valeurMax ;
    	private Liste listeSegment = new Liste() ;
     
    	public Image(String nomFichier) {
    		FileInputStream fichier ;
    		int c ;
    		try{
    			fichier = new FileInputStream("images/"+nomFichier) ;
    			BufferedReader f = new BufferedReader(fichier);
    			f.readLine();
    			f.readLine();
    			String s = f.readLine();
    			String[] split = s.split(" ");
    			this.largeur = Integer.parseInt(split[0]);
    			this.hauteur = Integer.parseInt(split[1]);
    			this.valeurMax = Integer.parseInt(f.readLine());			
    			System.out.println("Hauteur : "+this.hauteur + "\n largeur :"+ this.largeur 
    								+ "\n valeurmax : "  + this.valeurMax);
     
    			fichier.close();
     
    			}
    		}catch(FileNotFoundException ex){
    			System.out.println("Fichier n'existe pas");
    		}catch(IOException exc){
    			System.out.println("Erreur d'entrée sortie");
    		}
    	}
    // setteurs et getteurs ...
    Le code de la Liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public class Liste {
    	Segment premier;
     
    	public boolean estVide() {
    		return premier == null;
    	}
     
    	public Segment getPremier() {
    		return premier;
    	}
     
    	public void ajouterALaFin(int red,int green,int blue , int n) {
    		if (estVide()) {
    			premier = new Segment(red,green,blue,n);
    		} else {
    			Segment dernier = getDernierElement();
    			dernier.setSuivant(new Segment(red,green,blue,n));
    		}
    	}
     
     
    	private Segment getDernierElement() {
    		Segment dernier = premier;
    		while (dernier.getSuivant() != null) {
    			dernier = dernier.getSuivant();
    		}
    		return dernier;
    	}
     
    	public int getLongueur() {
    		int longueur = 0;
    		Segment elt = getPremier();
    		while (elt != null) {
    			longueur++;
    			elt = elt.getSuivant();
    		}
    		return longueur;
    	}
     
    	public void concatener(Liste l) {
    		if (this.estVide()) {
    			this.premier = l.premier;
    		} else {
    			Segment dernier = getDernierElement();
    			dernier.setSuivant(l.getPremier());
    		}
    	}
     
    	public void ecrireListe() {
    		System.out.print("[");
    		Segment elt = getPremier();
    		while (elt.getSuivant() != null) {
    			System.out.print("(" + elt.getRed()+","+elt.getGreen()+","+elt.getBlue()+")");
    			elt = elt.getSuivant();
    		}
    		System.out.println("(" + elt.getRed()+","+elt.getGreen()+","+elt.getBlue()+")" + "]");
    	}
     
    }
    ensuite le code de Segment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    public class Segment {
    	private int red,green,blue;
    	private int nombre ;
    	private Segment suivant;
     
    	public Segment(int red,int green,int blue , int n, Segment suivant) {
    		this.red = red;
    		this.green = green;
    		this.blue = blue;
    		this.nombre = n;
    		this.suivant = suivant;
    	}
     
    	public Segment(int red,int green,int blue , int n) {
    		this.red = red;
    		this.green = green;
    		this.blue = blue;
    		this.nombre = n;
    		this.suivant = null;
    	}
     
    	public int getRed() {
    		return red;
    	}
    	public void setRed(int red) {
    		this.red = red;
    	}
     
    	public int getGreen() {
    		return green;
    	}
    	public void setGreen(int green) {
    		this.green = green;
    	}
     
    	public int getBlue() {
    		return blue;
    	}
    	public void setBlue(int blue) {
    		this.blue = blue;
    	}
     
    	public int getNombre() {
    		return nombre;
    	}
     
    	public void setNombre(int nombre) {
    		this.nombre = nombre;
    	}
     
    	public Segment getSuivant() {
    		return suivant;
    	}
     
    	public void setSuivant(Segment suivant) {
    		this.suivant = suivant;
    	}
    }

    Edit : Je me suis trompé de forum , je voulais dans le débuter de General Java

  2. #2
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    j'ai édité , j'ai réussi à recuperer la largeur la hauteur et la valeur maximale mais je suis toujours bloquée pour mettre les données de l'image dans une ma liste chaînée .

  3. #3
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    déjà P3 indique qu'il s'agit du format ppm plain

    dans le format ppm, après la valeur max pour la couleur,

    on a des lignes de triplets de type (r, g, b) dont les valeurs (de r, de g, de b) sont des décimaux ascii (donc lisible directement dans une chaine de caractères et dont la valeur peut être obtenue avec un Integer.parsetInt()

    dans le format ppm raw (d'entête P6) tu aurais des nombres binaires au lieu des décimaux, en big endian, sur 8 ou 16 bits (8 bits si la couleur max est < 256, 16 bits sinon)

    pour moi le format le plus adapté est un tableau de triplets(une classe qui représente un triplet), à 2 dimensions, qu'on connait (on les a lues au début du fichier),

    le tableau à 2 dim me semble être le stockage le plus adapté, plus adapté en tout cas qu'une liste chainée


    ensuite, on lit les valeurs de cette manière en gros

    on initialise x=0, y=0

    on lit r, on lit g, on lit b, qu'on place dans un triplet

    lit r (ou lire g, ou lire b) c'est lire des caractères jusqu'au prochain whitespace en les concaténant dans un buffer (classe StringBuilder) puis Integer.parsetInt() sur la chaine lue pour avoir la valeur entière

    on place le triplet lu en (x,y),

    on fait x+1, si x>largeur, alors x=0 et y=y+1,

    etc... jusqu'à ce qu'on est plus rien à lire (ou qu'on ait atteint la fin de fichier, on ne sait jamais)

    subtilité : chaque fois qu'un whitespace est atteint, il faut lire tout les whitespaces jusqu'a un caractère non whitespace, pour commencer à lire la valeur suivante (dans le format P3, les nombre de whitespace est minimum 1 mais sans maximum).


    maintenant si le but de l'exercice est de charger les données dans une liste de de segment chainés (même si c'est un type totalement inadapté), la première question que je me pose c'est ou se trouve la notion de ligne de pixels ? (puisqu'on a des lignes de points),
    bon effectivement on peut utiliser la valeur de largeur n pour sauter dans la chaîne de n en n pour avoir chaque ligne de pixels

    l'algo est exactement le même que pour un tableau, sauf qu'on a même pas besoin de passer à la ligne en bout de ligne :

    en gros :

    tant qu'il y a quelquechose à lire
    lire un triplet et l'ajouter à la liste


    si au lieu de lire chaque valeur les unes après les autres tu préfères lires de lignes avec readLine et les splitter ensuite, c'est un peu près la même chose,

    on peut imaginer un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    void read(Liste liste, BufferedReader reader) throws IOException {
     
       String data = reader.readLine();
       if ( data!=null ) {
          readLine(liste, data);
       }
     
    }
     
    void read(Liste liste, String data) throws IOException {
     
         String[] split = split(data);
     
         int i=0;
         while((i=readNextSegment(liste,split,i)>=0);
     
    }
     
    int readNextSegment(Liste liste, String[] data, int index) throws IOException {
     
         if ( index==data.length ) {
            return -1;
         }
         else if ( index+3<=data.length ) {
              int r = read(data[index++]);
              int g = read(data[index++]);
              int b = read(data[index++]);
              addSegment(liste,  r, g, b );
         }
         else {
             throw new IOException("Il manque des données dans ce fichier (par exemple !)");
         }
     
         return index;
     
    }

    enfin, le code de la classe Liste et Segment, il t'es imposé ou c'est toi qui la mis au point ?

    Personnellement je trouve que passer le segment suivant d'un segment dans le constructeur c'est plutôt génant, parce que ça veut dire qu'il faut toujours lire les valeurs suivantes, en gros il faudrait commencer à lire le fichier par la fin. c'est pas le plus simple...
    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.

  4. #4
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Tout d'abord merci beaucoup pour ta réponse .
    Effectivement ça serait plus simple avec une genre de matrice mais je dois utiliser une liste chaînée de segments .

    Pour le code de la liste et du segment c'est moi qui l'ai crée .

    Je vais essayer de bien assimilé ce que tu dis et essayer d'adapter le code , je suis encore un peu perdu besoin d'une petite pause pour comprendre tout ça .

    Par contre il faut ne mettre qu'un segment pour plusieurs pixel de même couleur , par exemple 5 pixel rouge se suivant sera un segment(255,0,0,5) puis on passer au pixel de couleur suivante et je ne sais pas trop comment mettre ça en oeuvre pour l'instant .

    Personnellement je trouve que passer le segment suivant d'un segment dans le constructeur c'est plutôt génant, parce que ça veut dire qu'il faut toujours lire les valeurs suivantes, en gros il faudrait commencer à lire le fichier par la fin. c'est pas le plus simple...
    J'ai adapté le code donné en cours , et peut être que ce n'est pas une bonne chose mais je ne comprends pas vraiment pourquoi il faudrait commencer par la fin .
    Je devrais donc enlever ce constructeur et garder celui sans le segment suivant ?

    edit :
    la première question que je me pose c'est ou se trouve la notion de ligne de pixels ? (puisqu'on a des lignes de points),
    bon effectivement on peut utiliser la valeur de largeur n pour sauter dans la chaîne de n en n pour avoir chaque ligne de pixels
    Le prof à dit " Autrement dit, dans notre representation (comme dans le
    fichier PPM), on ne prend pas en compte les fins de lignes "

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Ok. Je n'avais pas capté la contrainte pour les segments.

    Donc en gros, on stocke pas chaque point séparément, on stocke de segment, de point contigu de même couleur.

    Ca me choque pas : c'est une sorte de compression en mémoire.

    Pour les fins de lignes, on peut toujours retrouver la matrice avec la largeur de l'image, donc ça me va aussi.

    pour la compression, on peut faire varier le code que j'avais indiqué (tu as remarqué que je t'ai laissé des trous (notamment le branchement avec ta liste chainée et tes segments),

    il suffit de détecter lorsqu'on change de couleur et de compter sinon, et on détermine ainsi la taille des segments...

    donc j'ajoute encore un niveau de méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    private int n, lastr, lastg, lastb; // attention ça rend statefull le code, donc plus threadsafe (il faudrait avoir un contexte pour résoudre le problème, un petit tableau d'entier par exemple)
    public void addSegment(Liste liste,  int r, int g, int b ) {
        if ( n!=0 ) {
            // on a déjà commencé un segment
            if ( r!=lastr ||  g!=lastg || b!=lastb ) {
               // une couleur au moins est différente
                addNewSegment(liste, lastr, lastg, lastb, n); // le segment précédent est ajouté à la liste
            }
            else {
               n++; // un point de plus dans le segment (même couleur, même segement)
               return; // attention retour à l'appelant
            }
        }
        // premier point d'un nouveau segment
        n=1;
        lastr=r;
        lastg=g;
        lastb=b;
    }
     
    }
    attention, il y a un truc à ne pas oublier : il faut penser au dernier segment, puisqu'on créé un segment toujours alors qu'on a lu la couleur suivante

    il faut modifier ce que j'avais mis comme condition d'arrêt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ( index==data.length ) {
            if (n!=0) {
                addNewSegment(liste, lastr, lastg, lastb, n);
            }
            return -1;
    }
    j'ai tapé ça direct dans l'éditeur du forum, j'ai pas vérifié si ça compile ou ça tourne, mais en gros c'est ça l'idée
    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
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Neolex Voir le message
    Le prof à dit " Autrement dit, dans notre representation (comme dans le
    fichier PPM), on ne prend pas en compte les fins de lignes "

    mmm, c'est pas tout à fait vrai, pas tout à fait faux

    d'ailleurs y'a une petite subtilité que j'ai pas pris en compte dans mon code

    avec un p6 (raw ppm), si je me trompe pas, on a une ligne de data par ligne de raster, donc on prend bien en compte les fin de ligne

    avec un p3 (plain ppm), il y a la limite des 70 car par lignes qui fait qu'effectivement une ligne de data n'est pas forcément une ligne de raster

    c'est d'ailleurs cette histoire de limite de 70 caractères que mon code ignore totalement :

    on peut imaginer qu'un code de couleur commence sur une ligne et continue sur la suivante

    c'est pour ça qu'a mon avis il serait plus judicieux de lire le fichier caractères par caractères, comme le format garanti qu'il y a toujours au moins un whitespace avant et au moins un whitespace après une valeur, on peut détecter facilement les différentes valeurs de couleur

    on peut procéder par exemple avec un tableau de char : on sait le dimensionner puisqu'on a la couleur max (si taille c'est le nombre de digit max pour représenter le nombre max de couleur )

    genre, rapidement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public int readNextValue(Reader reader) {
    while(true) {
    char c = readNextChar(reader);
    if ( c==0 ) return -1; // fin de fichier atteinte
    if ( Character.isWhiteSpace() ) {
         if ( nbread>0 ) {
         // nouvelle valeur de r, de g, ou de b
         int valeur Integer.parsetInt(new String(chararray, 0, nbread));
         nbread=0;
         return valeur;
         }
    }
    else {
         chararray[nbread]=c;
         nbread++;
    }
    }
     
    public char readNextChar(Reader reader) {
        int c = reader.read();
        if ( c<0 ) return 0; // le fichier ne contient vraisemblablement pas de caractère 0 donc on peut utiliser ce caractère pour fin de fichier (on pourrait utiliser EOF (26))
       else return (char)c;
    }
    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.

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Neolex Voir le message
    J'ai adapté le code donné en cours , et peut être que ce n'est pas une bonne chose mais je ne comprends pas vraiment pourquoi il faudrait commencer par la fin .
    Je devrais donc enlever ce constructeur et garder celui sans le segment suivant ?
    pour instancier un segment il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    segment=new Segment(red,green,blue , n, suivant)
    donc pour créer un segment, il faut connaitre :
    - red
    - green
    - blue
    - n
    et suivant

    donc pour créer un segment, il faut connaitre le segment suivant.

    si tu lis dans l'ordre,
    il faut lire les datas du premier segment et les garder dans un petit coin,
    puis lire les datas du second segment, et les garder dans un petit coin, parce qu'on peut pas créer de segment, on n'a pas encore lu le segment suivant, soit le 3ème segment, et ainsi de suite...

    on peut résoudre ça par un code récursif, mais si ton fichier est maousse, ça va prendre un max de mémoire et peut être même dépasser la taille max de la pile

    alors que si on lit par la fin, quand on veut créer un segment, on a toujours déjà lu le segment suivant avant, donc on peut le créer immédiatement

    sinon, voici un petit exemple de liste chainée vite fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    /**
     * @author jdrigo
     */
    public class LinkList<D> implements Iterable<D> {
     
    	private Link first;
    	private Link last;
    	private int size;
     
    	/**
             * 
             */
    	public LinkList() {
    	}
     
    	public boolean isEmpty() {
    		return first==null;
    	}
     
    	public LinkList<D> insert(D data) {
    		Link link = new Link(data);
    		if ( first==null ) {
    			first=link;
    			last=first;
    		}
    		else {
    			link.next=first;
    			first=link;
    		}
    		size++;
    		return this;
    	}
     
    	public LinkList<D> add(D data) {
    		Link link = new Link(data);
    		if ( first==null ) {
    			first=link;
    			last=link;
    		}
    		else {
    			last.next=link;
    			last=link;
    		}
    		size++;
    		return this;
    	}
     
    	public D last() {
    		if ( isEmpty() ) {
    			throw new IllegalStateException("Empty list");
    		}
    		else {
    			return last.getData();
    		}
    	}
     
    	public D first() {
    		if ( isEmpty() ) {
    			throw new IllegalStateException("Empty list");
    		}
    		else {
    			return first.getData();
    		}
    	}
     
    	public D removeFirst() {
    		if ( isEmpty() ) {
    			throw new IllegalStateException("Empty list");
    		}
    		else {
    			Link link;
    			if ( last==first ) {
    				link = last;
    				first=last=null;
    			}
    			else {
    				link = first;
    				first = first.next;
    			}
    			D data = link.getData();
    			link.reset();
    			size--;
    			return data;
    		}
    	}
     
    	public D removeLast() {
    		if ( isEmpty() ) {
    			throw new IllegalStateException("Empty list");
    		}
    		else {
    			Link link;
    			if ( last==first ) {
    				link = last;
    				first=last=null;
    			}
    			else {
    				link = last;
    				last = first;
    				while( last.next!=link ) {
    					last = last.next;
    				}
    				last.next=null;
    			}
    			D data = last.getData();
    			link.reset();
    			size--;
    			return data;
    		}
    	}
     
    	public void clear() {
    		if ( !isEmpty() ) {
    			Link link = first;
    			do {
    				link.reset();
    				link=link.next;
    			} while( link!=null );
    			first=last=null;
    		}
    	}
     
    	public int getSize() {
    		return size;
    	}
     
    	public Object[] toArray() {
    		Object[] array = new Object[size];
    		int index=0;
    		Link link=first;
    		while(link!=null) {
    			array[index++]=link.getData();
    			link=link.next;
    		}
    		return array;
    	}
     
    	public D[] toArray(D[] array) {
    		if ( array.length<size ) {
    			array = (D[]) Array.newInstance(array.getClass().getComponentType(), size);
    		}
    		int index=0;
    		Link link=first;
    		while(link!=null) {
    			array[index++]=link.getData();
    			link=link.next;
    		}
    		while (index<array.length) {
    			array[index++]=null;
    		}
    		return array;
    	}
     
    	@Override
    	public String toString() {
    		StringBuilder sb = new StringBuilder();
    		sb.append('[');
    		boolean first=true;
    		for(D data : this ) {
    			if ( first ) first=false; else sb.append(", ");
    			sb.append(data);
    		}
    		sb.append(']');
    		return sb.toString();
    	}
     
    	public Iterator<D> iterator() {
    		return new Iterator<D>() {
     
    			private Link next = first;
    			private Link read;
     
    			public D next() {
    				if ( next==null ) {
    					throw new NoSuchElementException();
    				}
    				if ( next.reset ) {
    					throw new ConcurrentModificationException();
    				}
    				D data = next.getData();
    				read = next;
    				next = next.next;
    				return data;
    			}
    			public boolean hasNext() {
    				if ( next==null ) {
    					return false;
    				}
    				if ( next.reset ) {
    					throw new ConcurrentModificationException();
    				}
    				return next!=null;
    			}
    			public void remove() {
    				if ( read!=null ) {
    					if ( read==first ) {
    						if( first==last ) {
    							last=null;
    						}
    						first=read.next;
    					}
    					else {
    						Link pref=first;
    						while( pref.next!=read ) {
    							pref=pref.next;
    						}
    						pref.next=read.next;
    					}
    					size--;
    					read.reset();
    					read=null;
    				}
    				else {
    					throw new IllegalStateException();
    				}
    			}
    		};
    	}
     
    	private class Link {
     
    		D data;
    		Link next;
    		boolean reset;
     
    		public Link(D data) {
    			this.data=data;
    		}
     
    		void reset() {
    			data=null;
    			next=null;
    			reset=true;
    		}
     
    		public D getData() {
    			return data;
    		}
     
    	}
     
    	public static void main(String[] args) {
     
    		LinkList<String> list = new LinkList<String>();
    		println(list);
    		list.add("1");
    		println(list);
    		list.add("2").add("3").add("4");
    		println(list);
    		list.insert("A").insert("B").insert("C");
    		println(list);
    		System.out.println("Remove first: " + list.removeFirst());
    		println(list);
    		System.out.println("Remove last: " + list.removeLast());
    		println(list);
    		System.out.println("First: " + list.first());
    		System.out.println("Last: " + list.last());
    		System.out.println(Arrays.toString(list.toArray()));
    		System.out.println(Arrays.toString(list.toArray(new String[3])));
    		System.out.println(Arrays.toString(list.toArray(new String[10])));
    		for(Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
    			String c = iter.next();
    			if ( "1".equals(c) ) {
    				iter.remove();
    			}
    		}
    		println(list);
    	}
     
    	private static void println(LinkList<String> list) {
    		System.out.println(list.getSize()+": " + list);
    	}
     
    }
    avec ta classe Segment tu aurais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkList<Segment> segments = new LinkList<Segment>();
    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
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    merci pour toute ces réponses , mais j'avoue que là je suis un peu perdu , je vais donc m'y remettre demain à tête reposée et je poserais d'autre questions si necessaire ...

    Merci pour ton aide !

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 18/03/2012, 17h18
  2. Insertion dans liste chaînée circulaire
    Par Cladouros dans le forum Débuter
    Réponses: 13
    Dernier message: 17/10/2010, 19h22
  3. Copier valeur choisie dans liste modifiable d'une combobox
    Par pinpin31 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/10/2008, 21h36
  4. insertion dans Liste chaînée
    Par ALIAS200 dans le forum Débuter
    Réponses: 12
    Dernier message: 29/02/2008, 09h20
  5. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51

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