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

avec Java Discussion :

Création d'une bibliothèque / TreeSet & Iterator


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 61
    Par défaut Création d'une bibliothèque / TreeSet & Iterator
    Bonjour,

    Je me présente, je suis étudiant et débutant en java.

    J'ai un exercice à réaliser dans le cadre scolaire :
    il s'agit de créer une bibliothèque musicale interactive, permettant de lister plusieurs artistes(Artist), avec leurs albums, ...

    Je dois créer 5 classes :
    -Main :
    va lancer le programme en créant simplement une instance de la classe Library,
    puis en appelant la méthode run() de cette classe Library
    -Library :
    La classe Library sera définie de la façon suivante :
    — Une bibliothèque qui sera de type TreeSet<Artist> ;
    5
    — On va définir plusieurs méthodes :
    — Une méthode run() qui va initialiser le TreeSet et appeler la méthode displayMenu()
    dans une boucle infinie ;
    — Une méthode displayMenu() qui va afficher un menu de contrôle de cette bibliothèque.
    La saisie de l’utilisateur sera récupérée et, selon la valeur saisie, on va appeler une des
    méthodes suivantes. Un exemple de menu est fourni ci-après :

    Bienvenue sur votre bibliothèque musicale !
    Tapez 1 pour ajouter un artiste à votre collection.
    Tapez 2 pour supprimer un artiste de votre collection.
    Tapez 3 pour lister tous les artistes.
    Tapez 4 pour ajouter un album à un artiste.
    Tapez 5 pour retirer un album à un artiste.
    Tapez 6 pour lister tous les albums pour un artiste donné.


    Des méthodes pour ajouter, supprimer et lister des albums à la bibliothèque, et pour ajouter, supprimer et lister des albums à un artiste.

    -Song :
    La classe Song sera définie de la façon suivante :
    — Une chanson possède deux attributs :
    — Un titre (sous forme de chaîne de caractères) ;
    — Une durée (sous forme d’un nombre entier représentant le nombre de secondes) ;
    — On va définir plusieurs méthodes :
    — Le constructeur par défaut ainsi qu’un autre constructeur permettant d’instancier un
    objet avec des valeurs précisées en paramètre ;
    — Une méthode toString() qui va retourner une chaîne de caractères sous la forme :
    titre (mm:ss) ;
    — Une méthode convertDuration() qui renvoie une chaîne de caractères au format
    mm:ss.
    -Album :
    La classe Album sera définie de la façon suivante :
    — Un album possède trois attributs :
    — Un titre (sous forme de chaîne de caratères) ;
    — Une année de sortie (un entier) ;
    — Des chansons (sous forme de List de chansons) ;
    — On va définir le constructeur par défaut ainsi qu’un autre constructeur permettant d’instancer un objet avec des valeurs précisées en paramètre ;
    — Une méthode toString() qui va retourner une chaîne de caractères au format suivant :
    Titre Album
    01 - Titre chanson 1 (mm:ss)
    02 - Titre chanson 2 (mm:ss)
    03 - Titre chanson 3 (mm:ss)
    ...
    -Artist
    La classe Artist sera définie de la façon suivante :
    — Un artiste possède trois attributs :
    — Un nom (sous forme de chaîne de caractères) ;
    — Une valeur booléenne indiquant si l’artiste est toujours actif ou non ;
    — Une liste d’albums sous la forme de List<Album> ;


    Les codes pour les différentes classes sont les suivantes :

    -Main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package cours_classes;
     
    public class Main {
    	public static void main(String[] args) {
    		Library Librairie= new Library();
    		Librairie.run();
    	}
     
    }

    -Library :
    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
    package cours_classes;
     
    import java.security.KeyStore.Entry;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.TreeSet;
     
     
    public class Library {
    	boolean check = false;
    	TreeSet<Artist> bibliothèque = new TreeSet<>();
    	ArrayList<Album> listeAlbum = new ArrayList<>();
     
    	public void run() {
    		Scanner scanner = new Scanner(System.in);
    		do {
    			displayMethod();			
    		}while(true);
    	}
    	public void displayMethod() {
    		System.out.println("Bienvenue sur votre bibliothèque musicale !\n"+
    				"Tapez 1 pour ajouter un artiste à votre collection.\n"+
    				"Tapez 2 pour supprimer un artiste de votre collection.\n"+
    				"Tapez 3 pour lister tous les artistes.\n"+
    				"Tapez 4 pour ajouter un album à un artiste.\n"+
    				"Tapez 5 pour retirer un album à un artiste.\n"+
    				"Tapez 6 pour lister tous les albums pour un artiste donné.\n"
    );
    		Scanner scanner = new Scanner(System.in);
    		int nbre = scanner.nextInt();
    		switch(nbre) {
    		case 1 :
    			addArtist();
    			break;
    		case 2 : 
    			removeArtist();
    			break;
    		case 3 : 
    			listArtists();
    			break;
    		case 4 :
    			addAlbum();
    			break;
    		case 5 :
    			removeAlbum();
    			break;
    		case 6 :
    			listAlbumsforArtists();
    			break;
    		}
     
    	}
    	public  void addArtist() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Quel est le nom de l'artiste que vous souhaitez ajouter?");
    		String nom = scanner.nextLine();
    		System.out.println("L'artiste est-il actif?(O/N"
    				+ ")");
    		char reponse = scanner.nextLine().charAt(0);
    		if (reponse =='O') {
    			check = true;
    		}
    		/*System.out.println("Quel est le nombre d'albums que l'artiste a produit?");
    		int nombre = scanner.nextInt();
    		scanner.nextLine();
    		for(int k = 0; k < nombre; k ++) {
    			System.out.println("Quel est le nom du prochain album de l'artiste?");
    			String album = scanner.nextLine();
    			listeAlbum.add(getAlbumByName(album));
    		}*/
    		    bibliothèque.add(new Artist(nom, check, listeAlbum));
    	}
    	public void removeArtist() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Quel est l'artiste que vous souhaitez enlever de la liste?");
    		String ArtistSupprim = scanner.nextLine();
    		if(bibliothèque.contains(ArtistSupprim)) {
    			bibliothèque.remove(getArtistByName(ArtistSupprim));
    		}
    	}
    	public Artist getArtistByName(String ArtistSupprim) {
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		while(iterator.hasNext()) {
    			Artist a = iterator.next();
    			if(a.nom==ArtistSupprim) {
    				return a;
    			}
    		}
    		return null;
    	}
    	public Album getAlbumByName(String albumName) {
    		Iterator<Album> iterator = listeAlbum.iterator();
    		while(iterator.hasNext()) {
    			Album alb = iterator.next();
    			if(alb.titre==albumName) {
    				return alb;
    			}
    		}
    		return null;
    	}
    	public void listArtists() {
    			Iterator<Artist> iterator = bibliothèque.iterator();
    			//ArrayList<Artist> listeArtistes = new ArrayList<>();
    			while(iterator.hasNext()) {
    				System.out.println(iterator.next());
    			}
    	}
    	public void addAlbum() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Quel est le nom de l'artiste dont vous "+
    		"souhaitez ajouter un album");
    		String artiste = scanner.nextLine();
    		System.out.println("Quel est le nom de l'album que vous souhaitez ajouter?");
    		String album = scanner.nextLine();
    		System.out.println("Quelle est l'année de sortie de cet album?");
    		int anneeDeSortie = scanner.nextInt();
    		System.out.println("Combien de chansons y a-t-il dans cet album?");
    		int nombre = scanner.nextInt();
    		scanner.nextLine();
    		ArrayList<Song> chansons = new ArrayList<>();
    		for(int k = 0; k < nombre; k ++) {
    			chansons.add(createSong());
    		}
    		Album albumAjoute = new Album(album, anneeDeSortie, chansons);
    	}
    	public Song createSong() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Quel est le nom de la chanson que vous souhaitez"+
    		" ajouter?");
    		String nomChanson = scanner.nextLine();
    		System.out.println("Quelle est la durée de la chanson?");
    		int duree = scanner.nextInt();
    		Song chanson = new Song(nomChanson, duree);
    		return chanson;
    	}
    	public void removeAlbum() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Quel est le nom de l'artiste dont vous souhaitez supprimer "+
    		"un album");
    		String artiste = scanner.nextLine();
    		System.out.println("Quel est le nom de son album à supprimer?");
    		String nomAlbum = scanner.nextLine();
    		listeAlbum.remove(getAlbumByName(nomAlbum));
    	}
    	public void listAlbumsforArtists() {
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		while(iterator.hasNext()) {
    			Artist e = iterator.next();
    			if(nameArtist==e.getName()) {
    				System.out.println(e.getAlbums());
    			}
    		}
    	}
     
    }

    -Song :
    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
    package cours_classes;
     
    public class Song {
    	String titre;
    	int duree;
    	public Song(String titre, int duree) {
    		this.titre=titre;
    		this.duree=duree;
    	}
    	public String toString() {
    		return(this.titre = " "+"("+this.getConvertedDuration()+")");
    	}
     
    	public String getConvertedDuration() {
    		if(this.duree<60) {
    			return(" "+this.duree+" ");
    		}
    		else {
    			int nbreMinutes = this.duree/60;
    			int nbreSecondes = this.duree%60;
    			return (" "+nbreMinutes+" : "+nbreSecondes+" ");
    		}
    	}
    }

    -Artist :
    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
    package cours_classes;
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
     
    public class Artist implements Comparable{
    	String nom="Inconnu";
    	boolean check = false;
    	ArrayList<Album> listeAlbum = new ArrayList<>();
    	public Artist(String nom, boolean check, ArrayList<Album> listeAlbum) {
     
     
    	}
    	public ArrayList<Album> getAlbums(){
    		return listeAlbum;
    	}
    	public String getName(){
    		return nom;
    	}
    	public void addAlbum(Album album) {
    		listeAlbum.add(album);
    	}
    	public void removeAlbum(String albumName) {
    		listeAlbum.remove(getAlbumByName(albumName));	
    	}
    	public String toString() {
    		return nom;
    	}
    	public Album getAlbumByName(String albumName) {
    		Iterator<Album> iterator = listeAlbum.iterator();
    		while(iterator.hasNext()) {
    			Album alb = iterator.next();
    			if(alb.titre==albumName) {
    				return alb;
    			}
    		}
    		return null;
    	}
     
    	@Override
    	public int compareTo(Object o) {
    	Artist other = (Artist) o;
    	return this.getName().compareTo(other.getName());
    	}
    }

    -Album :
    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
    package cours_classes;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Album {
    	String titre;
    	int anneeDeSortie;
    	ArrayList<Song> chansons;
    	public Album(String titre, int anneeDeSortie, List<Song> chansons) {
    		this.titre=titre;
    		this.anneeDeSortie=anneeDeSortie;
    	}
    	public String toString() {
    		StringBuilder builder = new StringBuilder();
    		builder.append(this.titre);
    		for(Song chanson : this.chansons) {
    			builder.append("\n\t").append(chanson.toString());
    		}
    		return builder.toString();
    	}
    }
    Le problème est le suivant : lorsque j'ai ajouté un artiste à ma bibliothèque, puis, que je tape sur 3 pour afficher l'artiste ajouté, Java me renvoie Inconnu.
    J'essaye de comprendre ce qui ne marche pas dans mon code. Sauriez-vous d'où vient le problème rencontré?

    En vous remerciant d'avance pour votre réponse.

    Je suis désolé par rapport à la taille de mon code qui n'est pas forcément agréable à lire.

    Bien cordialement,
    Gabriel Enriquez

  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 : 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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(alb.titre==albumName) {
    On ne teste pas l'égalité d'objets (ici de type String) avec == mais avec la méthode equals.
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 61
    Par défaut
    Merci beaucoup pour ta réponse,

    j'ai corrigé mon erreur, mais le programme affiche toujours Inconnu à la place de l'artiste ajouté.

    Je me demande quelle est la raison de ce problème, je pense que la raison se situe dans la fonction listArtists de la classe Library, je pense que j'ai dû mal utiliser la commande iterator.hasNext().

    En effet, je n'arrive pas à parcourir la TreeSet bibliothèque et faire des opérations sur ses éléments(comme par exemple retourner son nom, getName()), je n'arrive pas à utiliser Entry avec une TreeSet.

    Si vous avez une idée sur la résolution de ce problème, je vous serais reconnaissant si vous me l'expliquiez.

    Bien cordialement.

  4. #4
    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
    Le problème est juste dans le constructeur de la classe Artist :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Artist implements Comparable{
    	String nom="Inconnu";
    	boolean check = false;
    	ArrayList<Album> listeAlbum = new ArrayList<>();
    	public Artist(String nom, boolean check, ArrayList<Album> listeAlbum) {
     
     
    	}
     
    // etc
    Il manque le code qui affecte les valeurs des paramètres aux attributs correspondant, 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
    public class Artist implements Comparable{
    	String nom="Inconnu";
    	boolean check = false;
    	ArrayList<Album> listeAlbum = new ArrayList<>();
    	public Artist(String nom, boolean check, ArrayList<Album> listeAlbum) {
     
                this.nom = nom; 
                this.check = check; 
                this.listeAlbum = listeAlbum;  
     
    	}
     
    // etc



    Par ailleurs, attention, il ne faut pas créer sans arrêt des instances de Scanner sur System.in. Il faut en créer qu'une seule unique et l'utiliser partout (par exemple en static accessible de partout).

    Parce que la lecture du clavier est bufferisée : les caractères entrés au clavier sont stockés dans un tampon (=buffer), un tableau pour faire simple, parce que sinon il faudrait un programme qui passe son temps à attendre qu'on appuie sur une touche et
    qui réagisse assez vite pour chopper la touche suivante, sinon elle serait perdue. Tu imagines bien qu'au lieu de faire chauffer à mort le cpu pour tenir la cadence, on préfère faire un programme qui lit à son rithme ce qu'il y a dans le buffer, si ça va plus vite tant mieux, si va moins vite que la frappe de l'utilisateur, pas grave, sauf si le buffer clavier est plein (dans ce cas l'utilisateur est prévenu par un bip et il ne peut plus rien taper tant qu'il n'y a pas un peu de place dans le buffer).

    Quand tu appelles les méthodes du type next(), nextInt(), etc, des caractères vont être lus dans ce buffer et analysés, pour déterminer où se trouvent les limites de valeur à retourner (ce qu'on paramètre par la notion de delimiter). Il faut donc lire des caractères en avance et qui sont stockés dans l'instance de Scanner, et retirer du buffer. Le problème donc c'est que quand tu crées une nouvelle instance de Scanner, tu le fais sur System.in, un buffer qui ne contient donc pas forcément tous les caractères qu'il devrait pour bien lire le clavier (puisque certains ont déjà été lu d'avance par une autre instance de Scanner).
    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.

  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
    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message
    En effet, je n'arrive pas à parcourir la TreeSet bibliothèque et faire des opérations sur ses éléments(comme par exemple retourner son nom, getName()), je n'arrive pas à utiliser Entry avec une TreeSet.
    Tu n'as pas à utiliser Entry avec un TreeSet. A noter au passage que ce serait java.util.Map.Entry et non java.security.KeyStore.Entry (ce que tu as importé) d'où peut-être ce qui t'empêche de l'utiliser.

    Un parcours de set se fait comme ça, simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(Artist artist : bibliotheque) {
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Iterator<Artist> iterator = bibliotheque.iterator(); iterator.hasNext(); ) {
             Artist artist = iterator.next();
    }
    ou, comme tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Iterator<Artist> iterator = bibliotheque.iterator(); 
    while( iterator.hasNext() ) {
             Artist artist = iterator.next();
    }
    Il y a aussi les Stream, mais je ne sais pas si tu as le droit de les utiliser ou pas dans ton exercice, ainsi que les expressions lambda d'ailleurs. Ils sont particulièrement bien adaptés à la récupération de propriétés.

    avec un for, un foreach ou un while, il suffit de d'appeler les méthodes concernées

    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
    public List<Album> listeAlbumParNomArtist(String name) {
     
    for(Iterator<Artist> iterator = bibliotheque.iterator(); iterator.hasNext(); ) {
             Artist artist = iterator.next();
             if ( name.equals(artist.getName() ) {
                     // on a trouvé l'artiste cherché
                     return artist.getAlbums();
             }
     
    }
     
    // ici on n'a pas trouvé 
    return null; // par exemple, on pourrait aussi faire un throws new NoSuchElementException("Artist "+name+" non trouvé") par exemple, ou tout ce que tu veux
     
    }
    Si on veut supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Artist supprimeArtistParNom(String name) {
     
    for(Iterator<Artist> iterator = bibliotheque.iterator(); iterator.hasNext(); ) {
             Artist artist = iterator.next();
             if ( name.equals(artist.getName() ) {
                iterator.remove();
                return artist;
             }
     
    }
     
    // ici on n'a pas trouvé 
    return null; 
    }
    On peut faire plusieurs boucles, y compris imbriquées :

    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
    public List<Artist> artistesDontAlbumALeNom(String name) {
     
    List<Artist> artistes = new ArrayList<>();
    for(Iterator<Artist> iterator = bibliotheque.iterator(); iterator.hasNext(); ) {
             Artist artist = iterator.next();
             for(Iterator<Album> iterAlbum = artist.getAlbums().iterator(); iterAlbum.hasNext(); ) {
     
                       Album album = iterAlbum.next();
     
                       if ( album.getName().equals( name ) ) {
                                   // on a trouvé l'album cherché, on ajoute l'artiste à la liste
                                   artistes.add(artist);
                                  break;
                       }
     
             }
     
     
    }
     
    return artistes;
     
    }
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 61
    Par défaut
    Merci beaucoup pour tes conseils et tes explications sur Scanner et les buffer, ainsi que sur les boucles for avec les iterator.

    J'ai corrigé mon programme, toutes les fonctions marchent sauf lorsqu'il s'agit d'afficher des listes d'albums ou d'artistes.

    Je fais System.out.println(listArtists()) pour lister les artistes et System.out.println(listAlbumsforArtists()) dans mon programme run(), mais malheureusement, rien ne s'affiche dans la console. C'est-à-dire quand je tape 3 ou 6 dans la console, pour obtenir soit la liste des artistes(3) soit la liste des Albums(6), rien ne s'affiche

    Voici les codes de mes 2 fonctions :

    -la fonction listArtists() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void listArtists() {
    			Iterator<Artist> iterator = bibliothèque.iterator();
    			while(iterator.hasNext()) {
    				Artist artist = iterator.next();
    				System.out.println("L'artiste "+artist.nom+" appartient "+
    				"à cette bibliothèque musicale");
    			}
    	}
    -la fonction listAlbumsforArtist() :

    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
     
    	public void listAlbumsforArtists() {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		scanner.nextLine();
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         for(Iterator<Album> iterAlbum = artist.getAlbums().iterator(); iterAlbum.hasNext(); ) {
    	        	 Album album = iterAlbum.next();
    	        	 System.out.println("L'artiste "+artist.getName()+" a comme album : \n"
    							+" de titre "+album.titre+" sorti en : "+
    							album.anneeDeSortie);
    	                   }
    				}
    		}
    Je n'arrive pas à comprendre d'où vient l'erreur, j'ai pourtant effectué les corrections que tu m'a indiquées.

  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 Gabriel_Enriquezdu67 Voir le message
    -la fonction listArtists() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Artist listArtists() {
    			Iterator<Artist> iterator = bibliothèque.iterator();
    			while(iterator.hasNext()) {
    				Artist artist = iterator.next();
    				return artist;
    			}
    			return null;
    	}
    La première chose que je dirais c'est que c'est bizarre d'appeler cette méthode listArtists() puisque ça ne retourne forcément qu'un artiste (le premier dans le TreeSet, ou null, si bibliothèque est vide). Cela retourne forcément qu'un Artist au plus parce qu'il y a un return dans le while.
    Cependant, ça devrait quand même afficher quelque chose que de faire System.out.println(listArtists());.
    La seule explication qui me vient à l'esprit c'est que le nom du premier Artist est une chaîne vide.
    Déjà, pour afficher la liste des artistes, tu peux simplement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("bibliothèque: " + bibliothèque );
    Tu peux mettre ça au début de la méthode pour voir déjà ce que ça affiche. Même si le TreeSet est vide, tu auras un affichage de []. On peut aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("bibliothèque: " + bibliothèque + " / size: "+bibliothèque.size());
    histoire de distinguer si le TreeSet est vide, ou s'il ne contient qu'un Artiste de nom chaîne vide.
    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message
    -la fonction listAlbumsforArtist() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public ArrayList<Album> listAlbumsforArtists() {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		scanner.nextLine();
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		while(iterator.hasNext()) {
    			Artist artist = iterator.next();
    			if(nameArtist.equals(artist.getName())) {
    				return(artist.getAlbums());
    			}
    		}
    		return null;
    	}
    Je n'arrive pas à comprendre d'où vient l'erreur, j'ai pourtant effectué les corrections que tu m'a indiquées.
    Dans cette méthode, l'explication est plus évidente. Ce n'est pas que ça n'affiche rien, c'est que le programme attend que tu fasses une saisie pour continuer (il suffit de taper la touche entrée pour que le programme continue de s'exécuter). Ceci est dû au second scanner.nextLine() qui bloque le programme en attendant qu'on entre quelque chose. Il ne sert à rien ici.

    Remarque : comme la méthode peut retourner null, il convient de gérer le cas, par exemple en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<Album> albums = listAlbumsforArtists();
    if ( albums==null ) {
        System.out.println("Aucun artiste n'a été trouvé pour ce nom");
    }
    else {
        System.out.println("Albums de l'artiste demandé : " + albums);
    }
    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.

Discussions similaires

  1. Création d'une bibliothèque utilisant les sockets
    Par PouerK dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 26/02/2008, 07h43
  2. Création d'une bibliothèque
    Par nabilfaouzi dans le forum C
    Réponses: 5
    Dernier message: 15/02/2008, 17h30
  3. Création d'une bibliothèque.
    Par Kr00pS dans le forum C
    Réponses: 11
    Dernier message: 12/06/2006, 15h54

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