Comparer un élément d'un tableau avec ce que l'utilisateur écrit

jej -  
 jej -
Bonjour,
Je viens de commencer Java cette année et il nous ait demandé de créer un programme.
J'ai créé un tableau Clients. Ce que j'arrive pas à faire c'est comparer un élément de ce tableau avec ce que l'utilisateur écrit dans la fenêtre.
Je crois que le problème viens de mon LireClient.
Pouvez vous regarder si vous voyez une erreur ?
Merci beaucoup =)

Voici ma méthode LireClient (et la surcharge):

public static client LireClient(){
client cli = null;
System.out.println("quel est le nom du client?");
String nomcli = Lire.S();
Iterator<client> lesClients = mesClients.iterator();
while (lesClients.hasNext()){
cli = lesClients.next();
if (cli.getNom().compareTo(nomcli)==0){
break;
}

}
return cli;
}

// Surcharge de la méthode LireClient
public static client LireClient(String nomcli){
client cli = null;
Iterator<client> lesClients = mesClients.iterator();
while (lesClients.hasNext()){
cli = lesClients.next();
if (cli.getNom().compareTo(nomcli)==0){
break;
}

}
return cli;
}
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu as dans ton code des choses qu'il est impossible de savoir ce que c'est et tu dois nous dire ce que c'est (leur type, leur rôle, voire leur code) pour savoir s'il y a des erreurs dessus. Il s'agit de :

→ client
→ Lire.S()
→ mesClients

Sinon, au niveau de ta surcharge, les deux codes feront la même chose, sous réserve que String nomcli = Lire.S(); corresponde bien au paramètre String nomcli, et que "mesClients" (dont on ne sait rien) ait bien la même valeur dans les deux codes.

Remarques :
→ il faut utiliser correctement le mot-clé static, car ici tu fais référence à "mesClients" qui devrait soit être un paramètre de la méthode static, soit être utilisé dans un contexte non static, mais faire référence à un objet static est déconseillé.
→ je te conseilles de remplacer l'utilisation de ta boucle while sur les Iterator par une boucle "for each" qui est bien plus simple à coder, et donc moins source d'erreur.
→ tu devrais remplacer compareTo(nomcli)==0, par la méthode equals(nomcli)
→ je t'invite à respecter les conventions de nommages de Java (les noms de classes commencent par une majuscule, les noms de méthodes par une minuscule...)

public /*static*/ Client lireClient(/*Iterable<Client> lesClients*/)
{
    System.out.println("Quel est le nom du client ?");
    String nomCli = Lire.s();
    
    for (Client cli : lesClients)
        if (cli.getNom().equals(nomCli))
            return cli;
    
    return null;
}

public /*static*/ Client lireClient(/*Iterable<Client> lesClients, */String nomCli)
{    
    for (Client cli : lesClients)
        if (cli.getNom().equals(nomCli))
            return cli;
    
    return null;
}
0
jej
 
Je vous avoue que je ne comprend pas tout mais c'est parce que je suis un peu perdu dans tous ça.
J'utilise la méthode LireClient quand je veux que ne nom du client me soit retourné par exemple :

public static void approvisionner(){
client moncli = LireClient();
System.out.println("Le client est " + moncli.getNom());
}
En faite je pense que le problème vient de LireClient mais je ne suis pas sûr (je sais que le problème ne vient pas de ma classe fenêtre, que le tableau est bien instancié => chose que j'ai vérifier).
Mais j'ai l'impression que quand on appel la méthode getNom() ( de la classe client) le programme ne comprend pas.

Voici ma classe client (d'où vient le getNom()) :

public class client {

private String nom;
private double credit;

public client(String no, double cred){
nom = no;
credit = cred;

}

public String getNom(){
return nom;
}

public void affiche(){
System.out.println("le client " + nom + " a un crédit de " + credit);
}

public void setCredit(double montant){
credit = credit - montant;

}

public double getCredit(){
return credit;
}
}


Pour ce qui est de "mesClients" :

static ArrayList<client> mesClients = new ArrayList<client>();

// instanciation des clients
mesClients.add(new client("Lauriane",0));
mesClients.add(new client("Marie",0));
mesClients.add(new client("Clara",0));
mesClients.add(new client("Louise",0));



Encore merci pour votre aide
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tout ton code est correct, il fonctionne très bien chez moi (en l'utilisant bien). Il reste donc juste un truc que je ne connais pas c'est ton "Lire.S()" il faudrait vérifier qu'il te donne bien ce que tu veux...

Tu peux regarder ce code de test, pour voir :

import java.util.ArrayList;
import java.util.Iterator;

public class Test 
{
    static ArrayList<client> mesClients = new ArrayList<client>(); 
    
    public static client LireClient(){ 
        client cli = null; 
        System.out.println("quel est le nom du client?"); 
        String nomcli = Lire.S(); 
        System.out.println("le nom du client est : "+nomcli); 
        Iterator<client> lesClients = mesClients.iterator(); 
        while (lesClients.hasNext()){ 
            cli = lesClients.next(); 
            if (cli.getNom().compareTo(nomcli)==0){ 
                break; 
            } 

        } 
        return cli; 
    } 
    
    public static client LireClient(String nomcli){ 
        client cli = null; 
        Iterator<client> lesClients = mesClients.iterator(); 
        while (lesClients.hasNext()){ 
            cli = lesClients.next(); 
            if (cli.getNom().compareTo(nomcli)==0){ 
                break; 
            } 

        } 
        return cli; 
    }
    
    public static void main(String[] args)
    {
        // instanciation des clients 
        mesClients.add(new client("Lauriane",0)); 
        mesClients.add(new client("Marie",0)); 
        mesClients.add(new client("Clara",0)); 
        mesClients.add(new client("Louise",0)); 
        
        client c1 = LireClient("Lauriane");
        c1.affiche();
        
        client c2 = LireClient();
        if (c2!=null)
            c2.affiche();
        else
            System.out.println("Le client n'existe pas");
    }
} 
0
jej
 
Je viens de tester le code que vous m'avez donné. Il lit bien le client (c1) "lauriane" . Par contre pour ce qui est de lire c2 la console affiche toujours le dernier nom du tableau (qui est louise). Mais du coup je comprend pas d'où vient le problème parce que le LireClient marche sauf quand c'est l'utilisateur qui écrit (quand le LireClient doit comparer la variable que l'utilisateur écrit et ce qu'il y a dans le tableau) .
Pour ce qui est du Lire.S() voici le code de ma classe Lire() pour lire un String :

import java.io.*;
public class Lire
{
public static String S() // Lire un String
{
String tmp = "";
char C='\0';
try {
while ((C=(char) System.in.read()) !='\n')
{
if (C != '\r') tmp = tmp+C;

}
}
catch (IOException e)
{
System.out.println("Erreur de frappe");
System.exit(0);
}
return tmp;
} // fin de S()
}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
C'est parce que tu dois oublier les majuscules quand tu rentres les valeurs au clavier !
Si tu tapes "Lauriane" (avec un "L" majuscule) tu retrouveras bien le client "Lauriane", mais si tu tapes "lauriane" (avec un "l" minuscule) alors tu ne trouveras personne et par défaut c'est le dernier du tableau qui est affiché. Ce comportement par défaut est à modifier, il vient de ton return cli qui a toujours la dernière valeur du next() et ce que tu sortes de la boucle avec un break ou parce qu'il n'y a plus d'élément à lire... Il faut que tu distingues ces deux cas.

Remarque : ta méthode S fonctionne mais on peut faire nettement plus simple en utilisant des classes dédiées comme Scanner :

import java.util.Scanner;

public class Lire
{
	protected static final Scanner clavier = new Scanner(System.in);
	
	public static String ligne()
	{
		return clavier.nextLine();
	}
}
0
jej
 
Effectivement le problème venait seulement de la majuscule!
merci beaucoup pour tout vos conseils. Je prend note de tout cela.
0