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 :

Comparaison d'entiers louche


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Comparaison d'entiers louche
    Bonjour,

    C'est mon premier post ici et je viens avec une question tordue...

    J'ai un objet en Java qui contient un ArrayList (ArrayList<Message> messages (Message est une classe perso)).
    Je crée une méthode pour faire un itérateur qui donne les données de cette ArrayList par paquets de taille (int parcelSize dans mon code).

    Pour se faire, j'utilise un index (int messageIndex) pour savoir où j'en suis.

    Voilà le code pour la fonction hasNext() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	@Override
    	public boolean hasNext() {
    		return (messageIndex < (messages.size() - parcelSize));
    	}
    Voilà le code pour la fonction next():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	@Override
    	public Parcel next() {
    		Parcel p = new Parcel();
    		for (int i = messageIndex; i < messageIndex+parcelSize; i++) {
    				p.add(messages.get(i));
    		}
    		messageIndex += parcelSize;
    		return p;
    	}
    (Parcel est aussi une de mes classes qui hérite d'ArrayList<Message>)

    Mon problème est que par moment le hasNext() renvoie la valeur true alors que
    - messageIndex = 1930
    - messages.size() = 1939
    - parcelSize = 10

    Soit : true = (1930 < 1929) ???

    Et ça, je ne comprends pas.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Sinon tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List.subList(int fromIndex, int toIndex);
    qui a l'avantage de ne faire aucune copie des données de la liste.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Es-tu sûr de tes valeurs ? Tu les as obtenues comment ? Au debugger ou bien est-ce que tu les as calculé toi-même ? En particulier, es-tu certain que messages.size() renvoie toujours la même valeur ?

    Nota : Ta boucle fait une addition à chaque itération, ce qui est inutile, tu devrais plutôt faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i = 0; i < parcelSize; i++) {
    	p.add(messages.get(i));
    }

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    J'ai obtenu les valeurs avec le débugger d'eclipse. Pour cela, j'ai entouré le bloc à l'intérieur de la boucle for par un try/catch sur l'exception renvoyée par le tableau (index out of bounds) et j'ai mis un breakpoint dans le catch.

    Je n'ai pas vérifié si messages.size() renvoyaient toujours la même valeur. Je vais regarder cela. Dans mon code "principal" j'ai :

    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
     
    int j = 0;
    while( dataStream.hasNext() ) {
        if (j < trainingSize) {
            parceltron.feedTrainingElement(dataStream.next());
    	j++;
        }
        if (j == trainingSize) {
    	parceltron.trainModel();
    	results.add(parceltron.classify(dataStream.next()));
    	j++;
        }
        else {
    	results.add(parceltron.classify(dataStream.next()));
        }
    }
    Parfois, lors de cette boucle, le hasNext() répond true alors qu'il ne reste pas suffisamment de messages pour faire un paquet... (le dataStream est une instance de la classe dont je vous ai montré le code plus haut)

    Et en voyant ceci, j'ai aussi trouvé la cause du problème : j'ai oublié un else avant le second if. Forcément, vu comme c'était écrit, il y avait deux next() pour un hasNext() donc ça posait problème...

    Merci pour votre aide !

    P.S. : j'ai un poil honte quand même ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] comparaison deux entiers
    Par saminahoul dans le forum C#
    Réponses: 8
    Dernier message: 05/01/2013, 19h29
  2. Comparaison pointeur entier
    Par kathlyn222 dans le forum C
    Réponses: 9
    Dernier message: 11/12/2008, 13h50
  3. comparaison de deux entiers
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/01/2008, 08h50
  4. GTK+ comparaison entier valeur du pointeur
    Par Emyleet dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 21/07/2006, 15h28
  5. Réponses: 3
    Dernier message: 22/09/2005, 10h34

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