Résolu [Java] Problème (simple ?!) d'ArrayList - Difficultés d'accès aux données de l'Arr

Bonjour, j’ai un problème avec la mise en place d’Arraylist et son parcours

Pour simplifier, j’utilise 3 classes (ici amputer de lignes peu “importantes”) :

  • une classe Joueur
  • une classe MockDonnees : où l’on définit un ArrayList listeJoueurs de type Joueur
  • une classe Authentification : où l’on fait appel à une méthode Inscription (qui fonctionne) et une méthode Connexion (faisant appel à une méthode de MockDonnées)

L’ajout d’un joueur dans l’ArrayList s’effectue parfaitement (j’ai pu le vérifier)

Par contre, je galère (et je pense pourtant que c’est simple) pour développer la méthode VerifIdentiteJoueur(login, motpasse).
Elle me retourne toujours false, alors qu’elle devrait retourner vrai

J’ai essayé avec les fonctionnalités :

  • listeJoueurs.containes(monObjetJoueur) avec monObjetJouer = new Joueur(login, mot de passe) et j’obtient toujours flase
  • la méthodeslisteJoueurs.get(i).getPassword(login)).equals(“password”)) et j’obtiens toujours false
    Je ne sais pas comment faire et c’est important pour moi de trouver la solution. Peut être est-je mal utiliser les fonctionnalités détaillés précédemment. Merci beaucoup de m’aider pour que ma méthode VerifIdentiteJoueur fonctionne

Voici mes classes.

public class Joueur extends UnicastRemoteObject implements JoueurInterface {

	Score monScore = new Score();
	String loginJoueur;
	String monPassword;
  
	public Joueur() throws RemoteException {
  super();
	}
	
	public Joueur(String login, String pass) throws RemoteException {
  loginJoueur = login;
  monPassword = pass;
	}

	public String getPassword(String login){
  return this.monPassword;
	}
}

public class MockDonnees {
	static ArrayList < Joueur > listeJoueurs = new ArrayList < Joueur >();
	
	public MockDonnees() throws RemoteException {
	}
	
	public static final void AjoutJoueur(String login, String password) throws RemoteException{
  Joueur monJoueur = new Joueur(login, password);
  listeJoueurs.add(monJoueur);
	}
	public static final boolean VerifIdentiteJoueur(String login, String password) throws RemoteException{
  boolean trouve=false;
  /* Solution 1 envisagé mais qui ne fonctionne pas 
  Joueur monJoueur = new Joueur(login, password);
  trouve=listeJoueurs.contains(monJoueur);
  */
  
  /* Solution 2 envisagé mais qui ne fonctionne pas 
  /*for (int i =0; i <=  listeJoueurs.size(); i++)
  {
  	if ((listeJoueurs.get(i).getPassword(login)).equals("password")){
    trouve=true;
  	}
  }
  */

  return trouve;
  }
public class Authentification extends UnicastRemoteObject implements
  AuthentificationInterface {

	public Authentification() throws RemoteException{
	}
	public void Inscription(String login, String password) throws RemoteException {
  MockDonnees.AjoutJoueur(login, password);
	}
	
	public boolean Connexion(String login, String password) throws RemoteException {
  boolean cnnx=MockDonnees.VerifIdentiteJoueur(login, password);
  return cnnx;
	}
   

Dans la classe MockDonnees :
pour la solution 1 : elle ne peut pas marcher car à la création du joueur tu ne l’ajoutes pas à ton arraylist

pour la solution 2 le problème peut venir de ton for :


for (int i =0; i <  listeJoueurs.size(); i++) //condition de fin mauvaise

tu devrai commencer par tester la classe arraylist en lui ajoutant plusieurs joueur puis en affichant la liste d’objet qu’elle contient pour comparaison.

Ouep pour la condition de sortie de la boucle for.
Et pour le test, 'jaurais vu plutôt:


 for (int i =0; i <  listeJoueurs.size(); i++)
 {
  if ((listeJoueurs.get(i).getPassword(login)).equals(password)){
   trouve=true;
  }
 }

ton if testait avec la chaine de caractère "pasword" et non le contenu de la variable password

Tu entends quoi par en affichant la liste d’objets qu’elle cotient pour comparaison. Tu utilises quel méthode (ça peut paraitre con comme question)…

Merci, c’est tout bête mais quand on bidouille en faisant des tests, on fait pas gaffe parfois au “password” (chaine) et password (variable)
merci !

je l’avais vu aussi mais je pensais qu’il utilisais le password ‘password’ :smiley:

simplement


listeJoueurs.add(new Joueur("joueur1","p1"));
listeJoueurs.add(new Joueur("joueur2","p2"));
listeJoueurs.add(new Joueur("joueur2","p2"));

Joueur joueur;
for(int i = 0; i< listeJoueurs.size(); i++)
{
  joueur = listeJoueurs.get(i);
  System.out.println("login : "+joueur.getLogin() + "\tpassword : "+joueur.getPassword());
}

la classe Joueur contient une méthode renvoyant le login et une autre renvoyant le password; (on peut aussi faire dans ton cas getPassword(null) ).

Que c’est crade. Tu fais du java1.5 ou 1.6, pense le correctement ! Soit, avec foreach et les itérateurs :


for (Joueur joueur : listeJoueurs) {
  if (joueur == null) continue; // à virer, mais c'est juste pour l'idée
  if (joueur.getLogin().equals(login) && 
      joueur.getPassword().equals(password))
    return true;
}
return false;

Au passage, les noms de méthode, sauf le constructeur ça commence toujours par une minuscule.

tain ces gourous du Java :MDR

Bah :slight_smile:

Merci Mr. Forax :slight_smile:

En tout cas, j’aime bien l’itération.