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

  1. #1
    Membre du Club
    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
    Points : 44
    Points
    44
    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
    Points : 29 131
    Points
    29 131
    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.

  3. #3
    Membre du Club
    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
    Points : 44
    Points
    44
    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
    Points : 29 131
    Points
    29 131
    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).

  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
    Points : 29 131
    Points
    29 131
    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;
     
    }

  6. #6
    Membre du Club
    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
    Points : 44
    Points
    44
    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
    Points : 29 131
    Points
    29 131
    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);
    }

  8. #8
    Membre du Club
    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
    Points : 44
    Points
    44
    Par défaut
    Merci,
    J'ai changé le code de la fonction listArtists(), mais ça ne change rien quant au fait que le nom de l'artiste ne veut pas s'afficher :

    Voici le code de la fonction listArtists() :

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

    Quand je fais la commande suivante dans le displayMethod():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("bibliothèque: " + bibliothèque + " / size: "+bibliothèque.size());
    j'obtiens sur la console :
    Bibliothèque : [] /size : 0 ,

    Puis lorsque j'ajoute un artiste à la bibliothèque, celle-ci voit sa taille passer à 1, par contre lorsque je veux enlever des Artists, via la commande removeArtists(), la taille de la bibliothèque reste à 1, et de même lorsque je tente d'ajouter d'autres artistes à a bibliothèque, la taille de la bibliothèque reste figée à 1 et ne bouge plus.

    Sinon, j'ai enlevé le scanner.nextLine() dans la fonction listAlbumsforArtists().
    J'ai changé mon code de cette fonction pour le suivant, mais je ne l'ai pas encore testé :
    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
    public void listAlbumsforArtists() {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist==artist.getName()) {
    	        	 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);
    	                   }
    				}
    	         else {
    	        	 System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque.");
    	         }
    			}
    		}
    Qu'est-ce que tu penses de ces résultats et du code de la deuxième fonction listAlbumsforArtists(). En te remerciant d'avance si tu as une réponse à ce problème.

  9. #9
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message

    Puis lorsque j'ajoute un artiste à la bibliothèque, celle-ci voit sa taille passer à 1, par contre lorsque je veux enlever des Artists, via la commande removeArtists(), la taille de la bibliothèque reste à 1, et de même lorsque je tente d'ajouter d'autres artistes à a bibliothèque, la taille de la bibliothèque reste figée à 1 et ne bouge plus.
    Il y a un problème dans ta méthode compare de Artist, qui doit toujours retourner 0. Pour le TreeSet, ça veut dire que tous les Artists sont égaux, et il n'en garde qu'un.

    Montre-moi le code de la classe Artist.
    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message
    Sinon, j'ai enlevé le scanner.nextLine() dans la fonction listAlbumsforArtists().
    J'ai changé mon code de cette fonction pour le suivant, mais je ne l'ai pas encore testé :
    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
    public void listAlbumsforArtists() {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist==artist.getName()) {
    	        	 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);
    	                   }
    				}
    	         else {
    	        	 System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque.");
    	         }
    			}
    		}
    if(nameArtist==artist.getName())Je t'ai déjà dit qu'on ne testait pas l'égalité avec == mais avec equals().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	         else {
    	        	 System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque.");
    	         }
    Tu ne peux mettre ce else à cet endroit. Comme il est dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    , il va s'afficher pour tous les Artist dont le nom n'est pas égal au nom saisi.

    Au lieu de ça, tu peux utiliser un booléen :

    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
     
    boolean found=false;
    for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist.equals(artist.getName())) {
                             found=true;
    	        	 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);
    	                   }
                     }
    }
    if ( !found ) {
    	 System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque.");
    }

  10. #10
    Membre du Club
    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
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Voici le code de ma classe 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
    47
    48
    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) {
    		this.nom = nom;
    		this.check = check;
    		this.listeAlbum = 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.equals(albumName)) {
    				return alb;
    			}
    		}
    		return null;
    	}
     
    	@Override
    	public int compareTo(Object o) {
    	Artist other = (Artist) o;
    	return this.getName().compareTo(other.getName());
    	}
    }
    Pour moi, la méthode compareTo n'a pas l'air de renvoyer toujours 0.

    if(nameArtist==artist.getName())Je t'ai déjà dit qu'on ne testait pas l'égalité avec == mais avec equals().
    Désolé, j'avais oublié de le changer.

    Sinon, j'ai changé le code pour la fonction listAlbumsforArtists() comme tu me l'as indiqué, et elle marche, mis à part quand je lui demande d'afficher artist.getName() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println("L'artiste "+artist.getName()+" a comme album : \n"
    							+" de titre "+album.titre+" sorti en : "+
    							album.anneeDeSortie);
    Je pense en effet qu'il y a un problème dans la classe Artist().

    En te remerciant d'avance si tu as une solution pour enlever ce problème.

  11. #11
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message
    Pour moi, la méthode compareTo n'a pas l'air de renvoyer toujours 0.
    Oui, il n'y a pas de souci à priori dans la méthode compareTo. Tu devrais quand même implémenter Comparable<Artist> plutôt.

    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message
    Sinon, j'ai changé le code pour la fonction listAlbumsforArtists() comme tu me l'as indiqué, et elle marche, mis à part quand je lui demande d'afficher artist.getName() :
    C'est-à-dire exactement ? Quel comportement obtiens-tu ?


    A part ça, j'ai vu une erreur que je n'avais pas vue avant : tous les Artists ont la même liste d'albums partagée !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bibliothèque.add(new Artist(nom, check, listeAlbum));
    Ici l'instance de Artist est créée avec une instance unique de liste, référencée par la variable d'instance listeAlbum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Library {
    	boolean check = false;
    	TreeSet<Artist> bibliothèque = new TreeSet<>();
    	ArrayList<Album> listeAlbum = new ArrayList<>();
    //..
    Supprime cette variable et fais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bibliothèque.add(new Artist(nom, check, new ArrayList<>()));
    Pour le non fonctionnement de la suppression d'artiste, j'ai trouvé le problème, ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String ArtistSupprim = scanner.nextLine();
    		if(bibliothèque.contains(ArtistSupprim)) {
    			bibliothèque.remove(getArtistByName(ArtistSupprim));
    		}
    bibliothèque contient des instances de Artist. Appeler bibliothèque.contains() en passant une String en paramètre ne peut que retourner false, puisque bibliothèque ne contient pas de String. Et donc le remove n'est jamais exécuté.

    A la limite le if ne sert à rien : si tu supprimes quelque chose qui n'est pas dans le set, ça ne fait rien. Eventuellement, si tu veux pouvoir indiquer que la suppression a bien eu lieu, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(bibliothèque.remove(getArtistByName(ArtistSupprim))) {
       System.out.println("artiste "+ArtistSupprim+" supprimé");
    }
    else {
       System.out.println("Il n'existe aucun artiste de nom "+ArtistSupprim);
    		}
    Quant à l'ajout, pour l'instant je ne vois toujours pas pourquoi la taille resterait à 1, excepté si tu saisis toujours le même nom d'artiste.

  12. #12
    Membre du Club
    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
    Points : 44
    Points
    44
    Par défaut
    C'est-à-dire exactement ? Quel comportement obtiens-tu ?
    J'obtiens, pour la commande 6 :
    L'artiste a comme album :
    de titre DEBUT sorti en : 2017
    La commande n'affiche pas le nom de l'artiste, alors qu'elle est censée le faire vu le code que j'ai écrit. La commande artist.nom n'affiche rien, alors que les commandes artist.titre et artist.anneeDeSortie affichent les informations correctement.

    J'ai corrigé mon code, c'est-à-dire les fonctions removeArtist(), removeAlbum(), et j'ai changé toutes les fonctions qui utilisaient listeAlbums, pour leur permettre de prendre en compte le liste d'albums, créée à chaque nouvel artiste créée. Cependant, j'ai toujours les mêmes problèmes.

    Voici le nouveau code de ma classe 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
    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
    package cours_classes;
     
    import java.security.KeyStore.Entry;
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.NavigableSet;
    import java.util.NoSuchElementException;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.TreeSet;
     
     
    public class Library {
    	boolean check = false;
    	Scanner scanner = new Scanner(System.in);
    	TreeSet<Artist> bibliothèque = new TreeSet<>();
     
    	public void run() {
    		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"
    );
    		System.out.println("Bibliothèque : "+bibliothèque+" /size : "+bibliothèque.size());
    		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() {
    		System.out.println("Quel est le nom de l'artiste que vous souhaitez ajouter?");
    		String nom = scanner.nextLine();
    		scanner.nextLine();
    		System.out.println("L'artiste est-il actif?(O/N"
    				+ ")");
    		char reponse = scanner.nextLine().charAt(0);
    		if (reponse =='O') {
    			check = true;
    		}
    		bibliothèque.add(new  Artist(nom, check, new ArrayList<Album>()));
    	}
    	public void removeArtist() {
    		System.out.println("Quel est l'artiste que vous souhaitez enlever de la liste?");
    		scanner.nextLine();
    		String ArtistSupprim = scanner.nextLine();
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		while(iterator.hasNext()) {
    			Artist artist = iterator.next();
    			if(ArtistSupprim.equals(artist.getName())) {
    				iterator.remove();
    				System.out.println("L'artiste "+ArtistSupprim+" a été supprimé.");
    			}
    		}
    		System.out.println("L'artiste "+ArtistSupprim+" ne se situe pas dans la bibliothèque.");
    	}
    	public Artist getArtistByName(String artist) {
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		while(iterator.hasNext()) {
    			Artist a = iterator.next();
    			if(a.nom.equals(artist)) {
    				return a;
    			}
    		}
    		return null;
    	}
    	public Album getAlbumByName1(String albumName) {
    		System.out.println("Quel est le nom de l'artiste auquel appartient cet album?");
    		String artistName = scanner.nextLine();
    		Iterator<Artist> it = bibliothèque.iterator();
    		while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artistName)) {
    				artist.getAlbumByName(albumName);
    		}
    	}
    	return null;
    }
    	public void listArtists() {
    			for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    				Artist artist = iterator.next();
    				System.out.println("L'artiste "+artist.nom+" appartient "+
    				"à cette bibliothèque musicale");
    			}
    	}
    	public void addAlbum() {
    		System.out.println("Quel est le nom de l'artiste dont vous "+
    		"souhaitez ajouter un album?");
    		String artiste = scanner.nextLine();
    		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();
    		scanner.nextLine();
    		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);
    		Iterator<Artist> it = bibliothèque.iterator();
    		while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artiste)) {
    				artist.addAlbum(albumAjoute);
    		}
    	}
    }
    	public Song createSong() {
    		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();
    		scanner.nextLine();
    		Song chanson = new Song(nomChanson, duree);
    		return chanson;
    	}
    	public void removeAlbum() {
    		System.out.println("Quel est le nom de l'artiste dont vous souhaitez supprimer "+
    		"un album");
    		String artiste = scanner.nextLine();
    		scanner.nextLine();
    		System.out.println("Quel est le nom de son album à supprimer?");
    		String nomAlbum = scanner.nextLine();
    		scanner.nextLine();
    		Iterator<Artist> it = bibliothèque.iterator();
    		while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artiste)) {
    				artist.removeAlbum(nomAlbum);
    				System.out.println("album "+nomAlbum+" de l'artiste "+artiste+" supprimé");
    			}		
    		}
    		System.out.println("L'album "+nomAlbum+" n'existe pas dans la bibliothèque");
    	}
    	public void listAlbumsforArtists() {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		boolean found = false;
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist.contentEquals(artist.getName())) {
    	        	 found = true;
    	        	 for(Iterator<Album> iterAlbum = artist.getAlbums().iterator(); iterAlbum.hasNext(); ) {
    	        		 Album album = iterAlbum.next();
    	        		 System.out.println("L'artiste "+artist.nom+" a comme album : \n"
    							+" de titre "+album.titre+" sorti en : "+
    							album.anneeDeSortie);
    	                   }
    				}
    			}
    		if(!found) {
    			System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque");
    		}
    		}
     
    }
    En te remerciant pour ta réponse.

  13. #13
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gabriel_Enriquezdu67 Voir le message
    La commande artist.nom n'affiche rien, alors que les commandes artist.titre et artist.anneeDeSortie affichent les informations correctement.
    Tu veux dire album.titre et album.anneeDeSortie..., puisqu'il s'agit de propriétés de Album, et du coup, le problème reste bien au niveau de Artist mais pas de Album


    J'ai corrigé mon code, c'est-à-dire les fonctions removeArtist(), removeAlbum(), et j'ai changé toutes les fonctions qui utilisaient listeAlbums, pour leur permettre de prendre en compte le liste d'albums, créée à chaque nouvel artiste créée. Cependant,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(nameArtist.contentEquals(artist.getName())) {
    N'utilise pas contentEquals, mais equals. contentEquals ne sert à rien ici, equals est suffisant. contentEquals c'est quand on a besoin de tester l'égalité entre super type de String (genre StringBuilder à comparer avec String...).

    Mais bon, ça n'explique pas pourquoi tu n'as pas le nom.

    Si je reproduis un code de test/simulation avec ce que tu m'avais montré comme code, ça marche de mon côté, donc j'imagine que le problème est dans un code que tu ne m'as pas montré. Est-ce que tu peux simplement faire un zip de ton dossier src et le joindre dans ton prochain message.

    Le code que j'ai testé si tu veux voir si tu reproduis le problème avec ou pas :


    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
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    import java.util.TreeSet;
     
    public class TestArtistTreeSet {
     
    	public static void main(String[] args) {
    		TreeSet<Artist> bibliothèque = new TreeSet<>();
    		bibliothèque.add(new Artist("a", true, new ArrayList<>()));
    		bibliothèque.add(new Artist("b", true, new ArrayList<>()));
    		bibliothèque.add(new Artist("c", true, new ArrayList<>(Arrays.asList(new Album("x", 2017, new ArrayList<>())))));
    		bibliothèque.add(new Artist("d", true, new ArrayList<>()));
    		bibliothèque.add(new Artist("e", true, new ArrayList<>()));
    		System.out.println(bibliothèque);
    		listAlbumsforArtists(bibliothèque);
    	}
     
    	public static void listAlbumsforArtists(TreeSet<Artist> bibliothèque) {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = "c";
    		System.out.println("> " +nameArtist);
    		boolean found = false;
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist.contentEquals(artist.getName())) {
    	        	 found = true;
    	        	 for(Iterator<Album> iterAlbum = artist.getAlbums().iterator(); iterAlbum.hasNext(); ) {
    	        		 Album album = iterAlbum.next();
    	        		 System.out.println("L'artiste "+artist.nom+" a comme album : \n"
    							+" de titre "+album.titre+" sorti en : "+
    							album.anneeDeSortie);
    	                   }
    				}
    			}
    		if(!found) {
    			System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque");
    		}
    		}
     
     
    	public static 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;
     
    		}
    		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.equals(albumName)) {
    					return alb;
    				}
    			}
    			return null;
    		}
     
    		@Override
    		public int compareTo(Object o) {
    		Artist other = (Artist) o;
    		return this.getName().compareTo(other.getName());
    		}
    	}
     
    	public static 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();
    		}
    	}
     
     
    	public static 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+" ");
    			}
    		}
    	}
     
    }

  14. #14
    Membre du Club
    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
    Points : 44
    Points
    44
    Par défaut
    Voici mon code sous forme de fichier zip :

    TP_Cours5.zip

  15. #15
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    En fait le problème vient de ta lecture des "int" par nextInt(). Cela lit le prochain int dans le buffer clavier, mais ne consomme pas le retour-chariot. Du coup, il est encore dans le buffer, et c'est lui qui est lu lors de l'exécution de String nom = scanner.nextLine();. Et comme il n'y a rien après le int de choix de menu qui a été saisi, le nom saisi est considéré comme vide, et le scanner.nextLine(); juste après String nom = scanner.nextLine(); dans addArtiste, masque complètement le truc (c'est lui qui lit le nom saisi mais le stocke nulle part). Tous les Artits ont un nom vide, c'est pourquoi le TreeSet a toujours une taille de 1 et s'affiche []. La suppression elle saisit bien le nom mais ne le trouve pas, forcément, il n'y est pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	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"
    ); 
    		int nbre = scanner.nextInt();
    		scanner.nextLine();// lit le retour-chariot correspondant à la touche entrée
    En fait, il faudrait aller plus loin dans le cas général : tester s'il y a bien un int dans le buffer (avec scanner.hasNextInt()) avant de faire nextInt()
    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
    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"
    );
    if ( !scanner.hasNextInt() ) {
    			System.out.println("Choix incorrect... recommencez");
    			scanner.nextLine();
    			return;
    }
    int nbre = scanner.nextInt();
    scanner.nextLine();// lit le retour-chariot correspondant à la touche entrée
    ou, si tu ne veux pas que le menu se réaffiche à chaque fois :
    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 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"
    );
    		while ( !scanner.hasNextInt() ) {
    			System.out.println("Choix incorrect... recommencez");
    			scanner.nextLine();
    		}
    		int nbre = scanner.nextInt();
    		scanner.nextLine();
    Aussi, dans addArtists() enlève le
    juste après le String nom = scanner.nextLine();et celui avant String ArtistSupprim = scanner.nextLine(); dans removeArtist().

    A noter aussi que dans removeArtist, il manque la gestion du "found", ce qui veut dire que le message "L'artiste "+ArtistSupprim+" ne se situe pas dans la bibliothèque." s'affiche même quand l'artiste a été trouvé.
    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
    	public void removeArtist() {
    		System.out.println("Quel est l'artiste que vous souhaitez enlever de la liste?");
     
    		String ArtistSupprim = readNextString("Choix incorrect... recommencez");
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		boolean found=false;
    		while(iterator.hasNext()) {
    			Artist artist = iterator.next();
    			if(ArtistSupprim.equals(artist.getName())) {
    				iterator.remove();
    				found=true;
    				System.out.println("L'artiste "+ArtistSupprim+" a été supprimé.");
    			}
    		}
    		if ( !found) System.out.println("L'artiste "+ArtistSupprim+" ne se situe pas dans la bibliothèque.");
    	}
    On pourrait faire aussi :
    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 removeArtist() {
    		System.out.println("Quel est l'artiste que vous souhaitez enlever de la liste?");
     
    		String ArtistSupprim = readNextString("Choix incorrect... recommencez");
    		Iterator<Artist> iterator = bibliothèque.iterator(); 
    		while(iterator.hasNext()) {
    			Artist artist = iterator.next();
    			if(ArtistSupprim.equals(artist.getName())) {
    				iterator.remove();
    				System.out.println("L'artiste "+ArtistSupprim+" a été supprimé.");
                                    return;
    			}
    		}
    		System.out.println("L'artiste "+ArtistSupprim+" ne se situe pas dans la bibliothèque.");
    	}
    Tiens d'ailleurs, pour parfaire le truc, il faudrait penser que si on saisit un artiste déjà connu, on risque de perdre les données du précédent : il faudrait dire que l'artiste existe déjà par exemple, et ne pas faire l'ajout.

    Autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char reponse = scanner.nextLine().charAt(0);
    		if (reponse =='O') {
    			check = true;
    		}
    Tu ne gères pas ce check (un artists peut être actif ou pas, ça change rien nulle part). Si ça sert pas, supprimer ça. Si ça sert, l'implémenter correctement (donc ignorer les inactifs).
    Mais surtout il y a deux gros problèmes :
    1. Si on saisit n'importe quoi sauf un O majuscule, au premier artiste, il est inactif. Dur de pas avoir le droit de se tromper la première fois.
    2. Ensuite, si on saisit n'importe quoi sauf O, l'artiste est actif si le précédent était actif, ou inactif si le précédent était actif.


    la variable check doit être locale à la méthode et il faudrait tester que la valeur est bien O, o, N ou n, et utiliser un switch :

    Il y a aussi addAlbum() : on saisit un nom d'artiste, puis un album des chansons tout ça, plein de trucs, et manque de bol l'artiste n'est pas dans la bibliothèque... dommage, tout ce qu'on vient de saisir est perdu... je te laisse méditer toi-même ce problème et trouver une solution...

    Et dans removeAlbum(),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artiste)) {
    				artist.removeAlbum(nomAlbum);
    				System.out.println("album "+nomAlbum+" de l'artiste "+artiste+" supprimé"); 
    			}		
    		}
    		System.out.println("L'album "+nomAlbum+" n'existe pas dans la bibliothèque");
    le message "L'album "+nomAlbum+" n'existe pas dans la bibliothèque" sera toujours affiché, que l'artiste existe ou pas, que l'album existe ou pas...

    Pour en revenir à la gestion des saisies, globalement, il faudrait gérer dans des méthodes spécifiques la lecture du clavier afin de gérer tous les cas possible...

    Ce qu'on peut faire (en version simple, donc sans autorisation de saisie vide - dans ce cas, on passe juste à la ligne tant qu'on ne saisit pas quelque chose), 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
    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
    public int readNextInt(String messageRetry) {
    		do {
    			if ( scanner.hasNextInt() ) {
    				// si c'est bien un entier qui a été saisi, on le retourne
    				return scanner.nextInt();
    			}
    			// on a saisi autre chose qu'un nombre, on lit ce qui a été saisi, mais on l'ignore
    			if ( scanner.hasNext() ) {
    				scanner.next();
    			}
    			if ( messageRetry!=null ) {
    				System.out.println(messageRetry);
    			}
    		}
    		while( true );
    	}
     
    	public String readNextString(String messageRetry) {
    		do {
    			if ( scanner.hasNext() ) {
    				String s = scanner.next();
    				return s;
    			}
     
    			if ( messageRetry!=null ) {
    				System.out.println(messageRetry);
    			}
    		}
    		while( true );
    	}
     
    	public char readNextChar(String messageRetry) {
    		do {
    			if ( scanner.hasNext() ) {
    				String s = scanner.next();
    				if( !s.isEmpty() ) {
    					return s.charAt(0);
    				}
    			}
    			if ( messageRetry!=null ) {
    				System.out.println(messageRetry);
    			}
    		}
    		while( true );
    	}
    Ce qui permet après de gérer la saisie sans complication, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void main(String[] args) {
    		int[] tab = new int[3];
    		Library l = new Library();
    		for(int i=0; i<tab.length; i++ ) {
    			System.out.println("tab["+i+"] ?");
    			tab[i]=l.readNextInt("retry: int ?");
    		}
    		System.out.println("nom ?");
    		String nom = l.readNextString("pas glop !");
    	    System.out.println(nom+" : " + Arrays.toString(tab));
    	    System.out.println("ciao !");
    	}
    Avec l'application dans la classe Library (attention, je n'ai évidemment pas tout corrigé !)

    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
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Scanner;
    import java.util.TreeSet;
     
     
    public class Library { 
    	Scanner scanner = new Scanner(System.in);
    	TreeSet<Artist> bibliothèque = new TreeSet<>();
     
     
    	public int readNextInt(String messageRetry) {
    		do {
    			if ( scanner.hasNextInt() ) {
    				// si c'est bien un entier qui a été saisi, on le retourne
    				return scanner.nextInt();
    			}
    			// on a saisi autre chose qu'un nombre, on lit ce qui a été saisi, mais on l'ignore
    			if ( scanner.hasNext() ) {
    				scanner.next();
    			}
    			if ( messageRetry!=null ) {
    				System.out.println(messageRetry);
    			}
    		}
    		while( true );
    	}
     
    	public String readNextString(String messageRetry) {
    		do {
    			if ( scanner.hasNext() ) {
    				String s = scanner.next();
    				return s;
    			}
     
    			if ( messageRetry!=null ) {
    				System.out.println(messageRetry);
    			}
    		}
    		while( true );
    	}
     
    	public char readNextChar(String messageRetry) {
    		do {
    			if ( scanner.hasNext() ) {
    				String s = scanner.next();
    				if( !s.isEmpty() ) {
    					return s.charAt(0);
    				}
    			}
    			if ( messageRetry!=null ) {
    				System.out.println(messageRetry);
    			}
    		}
    		while( true );
    	}
     
     
     
    	public void run() {
    		do {
    			displayMethod();			
    		}while(true);
    	}
    	public void displayMethod() {
     
    		System.out.println("Etat actuel de votre bibliothèque : "+ bibliothèque.size() +" artiste(s)");
    		listArtists();
    		System.out.println("--------");
    		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"
    );
    		int nbre = readNextInt("Choix incorrect... recommencez"); 
    		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() {
    		System.out.println("Quel est le nom de l'artiste que vous souhaitez ajouter?");
    		String nom = readNextString("Choix incorrect... recommencez");
     
    		if ( getArtistByName(nom)!=null ) {
    			System.out.println("Cet artiste appartient déjà à la bibliothèque...");
    			return;
    		}
    		System.out.println("L'artiste est-il actif?(O/N"
    				+ ")");
    		Boolean check=null;
    		do {
    			char reponse = readNextChar("Choix incorrect... recommencez");
    			switch (reponse) {
    				case 'o':
    				case 'O':
    				check = true;
    				break;
    				case 'n':
    				case 'N':
    				check = false;
    				break;
    				default:
    					System.out.println("Veuillez répondre par O ou N...");
    			}
     
    		} while( check==null );
    		bibliothèque.add(new  Artist(nom, check, new ArrayList<Album>()));
    	}
    	public void removeArtist() {
    		System.out.println("Quel est l'artiste que vous souhaitez enlever de la liste?");
     
    		String ArtistSupprim = readNextString("Choix incorrect... recommencez");
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		boolean found=false;
    		while(iterator.hasNext()) {
    			Artist artist = iterator.next();
    			if(ArtistSupprim.equals(artist.getName())) {
    				iterator.remove();
    				found=true;
    				System.out.println("L'artiste "+ArtistSupprim+" a été supprimé.");
    			}
    		}
    		if ( !found) System.out.println("L'artiste "+ArtistSupprim+" ne se situe pas dans la bibliothèque.");
    	}
    	public Artist getArtistByName(String artist) {
    		Iterator<Artist> iterator = bibliothèque.iterator();
    		while(iterator.hasNext()) {
    			Artist a = iterator.next();
    			if(a.nom.equals(artist)) {
    				return a;
    			}
    		}
    		return null;
    	}
    	public Album getAlbumByName1(String albumName) {
    		System.out.println("Quel est le nom de l'artiste auquel appartient cet album?");
    		String artistName = scanner.nextLine();
    		Iterator<Artist> it = bibliothèque.iterator();
    		while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artistName)) {
    				artist.getAlbumByName(albumName);
    		}
    	}
    	return null;
    }
    	public void listArtists() {
    			for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    				Artist artist = iterator.next();
    				System.out.println("L'artiste "+artist.nom+" appartient "+
    				"à cette bibliothèque musicale");
    			}
    	}
    	public void addAlbum() {
    		System.out.println("Quel est le nom de l'artiste dont vous "+
    		"souhaitez ajouter un album?");
    		String artiste = readNextString("Saisie incorrecte... recommencez...");
    		System.out.println("Quel est le nom de l'album que vous souhaitez ajouter?");
    		String album = readNextString("Saisie incorrecte... recommencez...");
    		System.out.println("Quelle est l'année de sortie de cet album?");
    		int anneeDeSortie = readNextInt("Saisie incorrecte... recommencez...");
    		System.out.println("Combien de chansons y a-t-il dans cet album?");
    		int nombre = readNextInt("Saisie incorrecte... recommencez..."); 
    		ArrayList<Song> chansons = new ArrayList<>();
    		for(int k = 0; k < nombre; k ++) {
    			chansons.add(createSong());
    		}
    		Album albumAjoute = new Album(album, anneeDeSortie, chansons);
    		Iterator<Artist> it = bibliothèque.iterator();
    		while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artiste)) {
    				artist.addAlbum(albumAjoute);
    		}
    	}
    }
    	public Song createSong() {
    		System.out.println("Quel est le nom de la chanson que vous souhaitez"+
    		" ajouter?");
    		String nomChanson = readNextString("Saisie incorrecte... recommencez...");
    		System.out.println("Quelle est la durée de la chanson?");
    		int duree = readNextInt("Saisie incorrecte... recommencez...");
    		Song chanson = new Song(nomChanson, duree);
    		return chanson;
    	}
    	public void removeAlbum() {
    		System.out.println("Quel est le nom de l'artiste dont vous souhaitez supprimer "+
    		"un album");
    		String artiste = readNextString("Saisie incorrecte... recommencez...");
    		System.out.println("Quel est le nom de son album à supprimer?");
    		String nomAlbum = readNextString("Saisie incorrecte... recommencez...");
    		Iterator<Artist> it = bibliothèque.iterator();
    		while(it.hasNext()) {
    			Artist artist = it.next();
    			if(artist.getName().equals(artiste)) {
    				artist.removeAlbum(nomAlbum);
    				System.out.println("album "+nomAlbum+" de l'artiste "+artiste+" supprimé");
    				return;
    			}		
    		}
    		System.out.println("L'album "+nomAlbum+" n'existe pas dans la bibliothèque");
    	}
    	public void listAlbumsforArtists() {
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = readNextString("saisie incorrecte...recommencez");
    		boolean found = false;
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist.equals(artist.getName())) {
    	        	 found = true;
    	        	 for(Iterator<Album> iterAlbum = artist.getAlbums().iterator(); iterAlbum.hasNext(); ) {
    	        		 Album album = iterAlbum.next();
    	        		 System.out.println("L'artiste "+artist.nom+" a comme album : \n"
    							+" de titre "+album.titre+" sorti en : "+
    							album.anneeDeSortie);
    	                   }
    				}
    			}
    		if(!found) {
    			System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque");
    		}
    		}
     
    }

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2019
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Merci
    Merci beaucoup pour tes conseils et tes explications sur Scanner

  17. #17
    Membre du Club
    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
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup pour tes corrections et tes conseils pour améliorer le programme,

    J'ai corrigé les fonctions displayMethod(), addArtists(), removeArtists(), removeAlbums() et maintenant, le programme fonctionne sauf sur une fonction, il me reste plus qu'à corriger la fonction listAlbumsforArtists(), qui ne renvoie pas de message alors que l'artiste est présent dans la bibliothèque :

    fonction listAlbumsforArtists() :

    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
    public void listAlbumsforArtists() {
    		boolean found = false;
    		scanner.nextLine();
    		System.out.println("Quel est le nom de l'artiste dont on veut lister les albums?");
    		String nameArtist = scanner.nextLine();
    		for(Iterator<Artist> iterator = bibliothèque.iterator(); iterator.hasNext(); ) {
    	         Artist artist = iterator.next();
    	         if(nameArtist.equals(artist.getName())) {
    	        	 found = true;
    	        	 for(Iterator<Album> iterAlbum = artist.getAlbums().iterator(); iterAlbum.hasNext(); ) {
    	        		 Album album = iterAlbum.next();
    	        		 System.out.println("L'artiste "+artist.nom+" a comme album : \n"
    							+" de titre "+album.titre+" sorti en : "+
    							album.anneeDeSortie);
    	                   }
    				}
    			}
    		if(!found) {
    			System.out.println("Le nom de l'artiste n'a pas été trouvé dans la bibliothèque");
    		}
    		}
    Pour toutes les autres fonctions, le programme fonctionne, grâce à tes conseils, merci.

    Sinon, pour l'amélioration du code ( ne pas obliger l'utilisateur à taper toutes les info sur un artiste s'il n'est pas présent dans la bibliothèque, par exemple), je n'ai pas encore commencé à la faire.

  18. #18
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je me rend compte que je n'ai pas pensé qu'on pourrait avoir envie de saisir des noms d'artistes ou d'albums avec des espaces dedans.

    Pour pouvoir le faire, il suffit de définir le scanner comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Scanner scanner = new Scanner(System.in).useDelimiter("\r\n");

  19. #19
    Membre du Club
    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
    Points : 44
    Points
    44
    Par défaut
    D'accord merci

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