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

Langage Java Discussion :

pb de taille de liste


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut pb de taille de liste
    Bonsoir,
    J'ai un pb avec le bout de code suivant et je ne comprend vraiment pas pourquoi!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Random random = new Random();
     
    			int numeroCarte1 = random.nextInt(pioche.size()-1);
     
    			System.out.println("vous piochez\t"+ pioche.get(numeroCarte1));
    eclipse ne veut pas me le compiler, il doit y avoir un pb avec les indices mais je ne vois pas lequel.
    J'explique ce que je veux faire:
    je veux afficher le nom d'une carte de la pioche(pour l'instant je ne la pioche pas, donc pas de remove)
    Si la pioche contient 10 cartes alors les indices vont de 0 à 9 donc, si je veux afficher le nom d'une carte au hasard, il faut que je fasse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    random.nextInt(pioche.size()-1);
    et alors je génére un nombre compris entre 0 et 10 -1 soit 9
    Je ne vois pas où est le pb


    Merci d'avance de votre aide

  2. #2
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Si tu as une erreur de compilation donne nous le message et dis nous sur quelle ligne elle apparait.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Ok alors voici le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
    	at java.util.Random.nextInt(Unknown Source)
    	at Joueur.Joueur.piocherUneCarte(Joueur.java:71)
    	at Joueur.Joueur.jouerSonTour(Joueur.java:138)
    	at Jeu.Moteur.main(Moteur.java:320)
    Voici la ligne 71

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int numeroCarte1 = random.nextInt(pioche.size()-1);
    et voici le bout de code qui contient la ligne 71

    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
    Random random = new Random();
    		for(int i=0;i <2;i ++ ){
    			int numeroCarte1 = random.nextInt(pioche.size()-1);
     
    			System.out.println("vous piochez\t"+ pioche.get(numeroCarte1));
    			int numeroCarte2=numeroCarte1;
     
    				while (numeroCarte2==numeroCarte1){
    					numeroCarte2 = random.nextInt(pioche.size()-1);
    				}
     
    			System.out.println("vous piochez\t"+ pioche.get(numeroCarte2));
     
     
    			System.out.println("Si vous voullez garder la première carte, tapez 1, sinon tapez 2.La carte que vous " +
    					"n'aurez pas choisie sera replacée dans le paquet");
    			int choix=0;
    			choix=Clavier.lireInt();
     
    				while((choix!=1)&&(choix!=2)){
    					System.out.println("Choisissez l'une des cartes");
    					choix=Clavier.lireInt();
    				}
     
    				switch (choix){
     
    					case 1: System.out.println("vous avez pioché"+pioche.get(numeroCarte1));choix=1;pioche.remove(numeroCarte1);;break;
    					case 2: System.out.println("vous avez pioché"+pioche.get(numeroCarte2));choix=2;pioche.remove(numeroCarte2);break;
    				}
    		}
    Je pense que les erreurs 138 et 320 sont des conséquences de la première ...

    Merci bcp de votre aide

  4. #4
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    D'après l'erreur à un moment de l'exécution de ta liste pioche est vide donc son nombre d'élément - 1 est négatif ce qui cause une exception dans le random.nextInt.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Ce qui compte c'est que la pioche ne soit pas vide au moment ou j'utilise la méthode nextInt(), non?

  6. #6
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Citation Envoyé par tanguy.L Voir le message
    Ce qui compte c'est que la pioche ne soit pas vide au moment ou j'utilise la méthode nextInt(), non?
    Oui exactement c'est à dire qu'il faut que (pioche.size()-1)>0
    Mais en plus le code que le poste ne nous aide pas pour savoir si pioche est bien rempli de quelque chose
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  7. #7
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    OK
    c'est bon j'ai trouvé le pb, mais par contre je ne sais pas comment le corriger!!
    Alors en fait ce qui se passe c'est que dans ma méthode main, je crée une liste que j'appelle pioche dans laquelle je met mes cartes.
    Par contre la ligne qui pose un pb se trouve dans une autre classe. Donc je pense que mon code ne permet pas à eclipse de comprendre que pioche est déjà crée dans ma méthode main...

    En bref : Comment fait-on pour indiquer au sein d'une classe A que la liste pioche sur laquelle cette classe va travailler se trouve dans une autre classe B?

    Merci bcp

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Je pense avoir trouvé la solution, pouvez vous me dire si cette solution est optimale?

    En fait j'ai crée une classe Pioche dans laquelle j'ai implémenté une méthode initialiserLaPioche() qui initialise le pioche et qui retourne une liste de Carte : pioche

    Ensuite quand j' ai besoin de ma pioche je fait

    Pioche.initialiserLaPioche()
    J'ai découvert un truc étrange...
    Je peux faire sans pb:

    Pioche.initialiserLaPioche().size()
    par contre si je veux faire
    Pioche.initialiserLaPioche().add(....)
    alors là il me demande de "caster"
    C'est à dire (apparement ) de préciser le type que je met dans la pioche.
    Je trouve étonnant qu'il me demande ce que je veux mettre dans ma pioche vu que je lui ai déjà dit que pioche était une liste de Carte.

    Comment cela se fait il?

    Merci bcp

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Salut,
    Tu devrais mettre le code de ta classe, en pus de ce que tu veux faire, celà serait plus simple pour voir les erreurs.

    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
     
    class Carte {
    //... code pour une carte
    }
     
    class Pioche {
     
    public final List<Carte> pioche;
     
    public Pioche() {
    pioche=new ArrayList<Carte>();
    pioche.add(new Carte());
    pioche.size();
    //...
    }
     
    }
    Avec ce type de code, tu ne devrais plus rien avoir affaire avec les cast quand tu utilises des cartes.
    Après, tu peux restreindre l'accès à ta List pioche en mettant sa visibilité à public ou protected et en fournissant une interface pour ta pioche.

  10. #10
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Voilà le code de ma classe :

    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 class Pioche {
     
    static ArrayList<CarteQuartier> pioche = new ArrayList<CarteQuartier>(); 
     
    public Pioche() {
    }
    public static ArrayList<CarteQuartier> initialiserLaPioche(){
     
    	 ArrayList<CarteQuartier> pioche = new ArrayList<CarteQuartier>(); 
     
    	CarteQuartier carte0 = new CarteQuartier("Donjon", "violet", 3);
    	pioche.add(carte0);
    return pioche;
    }
     
    }
    Je ne sais pas pourquoi, mais eclipse me demande de mettre ces méthodes en static, alors pour l'instant je l'ai fait, mais j'aimerais comprendre pourquoi il me demande ça.

    Sinon, j'ai essayé ton code, mais ça ne marche pas super, j'ai des messages d'erreurs...

    Sinon, est ce un pb d'avoir à utiliser cast?
    Et au fait qu'est ce que ça veut dire??

    Merci bcp

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    En fait echipse veut que tu mettes InitialiserLaPioche en static car tu appelles la méthode de facon statique.

    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pioche.initialiserLaPioche()
    tu appelles la methode de classe Pioche. Si tu veux que InitialiserLaPioche ne soit plus statique alors tu dois faire du genre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pioche pioche = Pioche ();
    pioche.initialiserLaPioche(); 
    ....

  12. #12
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Si j'ai bien compris, une méthode static s'effectue sur une classe, alors qu'une méthode classique(dsl pour le jeu de mot) s'effectue sur une instance de classe?

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Oui.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Sinon, est ce un pb d'avoir à utiliser cast?
    Et au fait qu'est ce que ça veut dire??
    Non quelquefois, il est difficile d'éviter de passer par les cast. Mais avec la généricité (c.f. , penser en java), tu ramener le nombre de cast de ton programme vers 0. C'est possible mais à éviter car cela ne rend pas ton code portable.

    Caster c'est tout simplement spécifier le type d'une variable "en dur" dans le programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Object o;
    Integer n= (Integer) o;
    J'ai un objet o et je le mets dans l'objet n de type Integer en lui demandant de le caster. La JVM va vérifier que o peut-être transformé en Integer. Si c'est possible, elle le fera, sinon elle enverra une exception.

    Ok, il y avait des messages d'erreur dans mon code, je l'avais pas compiler
    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
     
     
     
    class Carte {
    	//... code pour une carte
    	int id;
     
    	/**
             * @param id
             */
    	public Carte(int id) {
    		super();
    		this.id = id;
    	}
     
    	/**
             * @see java.lang.Object#toString()
             */
    	@Override
    	public String toString() {
    		return String.valueOf(id);
    	}
     
     
     
     
    }
     
    class Pioche {
     
    	public final List<Carte> pioche;
     
    	private Random rnd=new Random();
     
    	public Pioche() {
    		this.pioche=new ArrayList<Carte>();
    		this.pioche.add(new Carte(0));
    		this.pioche.add(new Carte(1));
    		this.pioche.add(new Carte(2));
    		this.pioche.add(new Carte(3));
    		this.pioche.size();
    		//...
    	}
     
    	public Carte piocher() {
    		return this.pioche.remove(rnd.nextInt(this.pioche.size()));
     
    	}
    }
    J'ai repidement testé sur le main suivant. Ca devrait marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public static void main(String[] args) {
    		Pioche p=new Pioche();
    		System.out.println(p.piocher());
    		System.out.println(p.piocher());
    		System.out.println(p.piocher());
    		System.out.println(p.piocher());
    	}

Discussions similaires

  1. [IP-2010] Taille des listes déroulantes
    Par Blakovic dans le forum InfoPath
    Réponses: 1
    Dernier message: 02/09/2013, 08h58
  2. [SQL] Taille maximale liste SQL en SAS
    Par Jefbrel dans le forum SAS Base
    Réponses: 7
    Dernier message: 21/06/2011, 19h06
  3. [OL-2003] Taille des listes de distribution
    Par Daejung dans le forum Contribuez
    Réponses: 1
    Dernier message: 11/03/2010, 00h34
  4. [HTML] probleme réglage de taille de liste de choix
    Par sephirothmana dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 19/06/2006, 11h42
  5. SQL 2000 - Liste + taille des tables et index
    Par Fox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2004, 15h59

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