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

Java Discussion :

Problème parcours liste Array ?


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Points : 56
    Points
    56
    Par défaut Problème parcours liste Array ?
    Bonjour chers collègues !

    Je développe actuellement une application autonome en java.
    Cette application va parcourir l'arborescence d'un dossier pour analyser des fichiers. Dans chaque fichiers il y a environ 30 000 lignes d'informations.
    Parmi celles ci, il y a des lignes intéressantes.

    Sur toutes les lignes, les différents paramètres dont j'ai besoin sont séparés par des "|" et je récupère seulement les lignes dans lesquelles il y a des requêtes sql qui m'intéresse.

    Maintenant que le sujet est bien présenté, voici le gros du problème.

    Pour sauvegarder ces paramètres j'ai donc créé une liste array pour me simplifier la vie au niveau de la taille de la liste. Dans mon "main" je crée 2 listes identiques qui possèdent toutes les données nécessaires à mon travail. Le problème se passe lors du parcours :
    J'aimerai pouvoir remplir les données manquantes dans certains objets de ma liste, mais mon programme ne rentre pas dans mon "if" qui va dire au programme que le paramètre "untel" de l'objet de la liste 1 est vide et qu'il faut le remplir par rapport au paramètre 'untel' de l'objet de la liste 2 qui lui est plein, tout ça si les codes_msgid et code_user des objets sont identiques.
    J'ai cru déceler le début de mon problème une fois que le problème passe dans le 1er "if" !

    Voici un bout de code.

    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
    public static void main (String[] args) {
     
    		File rep = new File("C:\\Temp");
    		List<MSG_ID> list_msgid1 = new ArrayList<MSG_ID>();
    		List<MSG_ID> list_msgid2 = new ArrayList<MSG_ID>();
     
    		//Collections.sort(list_msgid1);
    		list_msgid1 = anaFic(listFicLog(rep));
    		list_msgid2 = list_msgid1;
     
     
     
    		for(int i = 0; i < list_msgid1.size(); i++){ // tant que j'ai un element non parcouru dans la liste principale
     
    			MSG_ID m1 = list_msgid1.get(i);
     
    			for(int j = 0; j < list_msgid2.size(); j++){ //on parcourt la même liste pour comparer et associer les différents paramètres
     
    				MSG_ID m2 = list_msgid2.get(j);
     
     
    				if(m1.get_code_msgid() ==  m2.get_code_msgid() && m1.get_code_user() == m2.get_code_user()){ //on retrouve l'utilisateur avec son pda
     
     
     
    					if(m1.get_requete_select() == "" && m2.get_requete_select() != ""){
    						//cas où l'objet qui contient la requête select ne contient pas de données
    						//on remplit donc les paramètres qui sont associés à la requête select dans l'objet MSG_ID
    						System.out.println("Remplissage Select");
    						m1.set_heure_select(m2.get_heure_select());
    						m1.set_requete_select(m2.get_requete_select());
    						list_msgid1.remove(j);//supprime l'objet devenu obsolète
     
     
    					}
    					else if(m1.get_requete_insert() == "" && m2.get_requete_insert() != ""){
    						//cas où l'objet qui contient la requête insert ne contient pas de données
    						//on remplit donc les paramètres qui sont associés insert à la requête dans l'objet MSG_ID
    						System.out.println("Remplissage insert");
    						m1.set_heure_insert(m2.get_heure_insert());
    						m1.set_requete_insert(m2.get_requete_insert());
    						list_msgid1.remove(j);//supprime l'objet devenu obsolète
    					}
     
    				}
     
    			}
     
    		}
     
     
    		System.out.println("Analyse des fichiers terminée !");
     
     
     
    	}

    un exemple parlant de mon problème dans 2 objets différents :

    Objet 1 :

    Code msgid : 479599919822326460
    Code user : 000198
    Code zetes : 0
    Heure requête insert : 20:47:26
    Requête insert : <Insert into blabla>
    Heure requête select :
    Requête select :

    Objet 2 :

    Code msgid : 479599919822326460
    Code user : 000198
    Code zetes : 0
    Heure requête insert :
    Requête insert :
    Heure requête select : 20:47:36
    Requête select : <select blabla>

    Vous voyez bien que malgré que le paramètre select du 1er objet est vide, il devrait se remplir par rapport à l'objet 2, mais ne le fait pas puisqu'il ne peut aller dans le "if" créé à ce sujet.

    Je suis disponible à tout moment pour toute aide à la compréhension de ce problème, je checkerai assez souvent l'aide proposée tout en continuant de m'arracher les cheveux sur mon erreur qui est surement aussi grosse que l'écran .

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Bon j'ai trouvé ...
    Une méthode débile est à appliquer dans mon if, je laisse mon problème pour connaître vos avis (si je pouvais améliorer mon code par exemple).

  3. #3
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    bonjour Baboulinet_

    Quand je teste une chaine de caractères , je fait

    en non pas
    pas sur que cela resolve tout.
    Page sur Developpez : http://pbriand.developpez.com

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Disons qu'il faut faire equals() et non pas ==. C'est une certitude.

    Enfin, dans le cas présent, on pourrait aussi vérifier si la longueur de la chaîne est zéro :

    Mais bon, on ne connaît pas trop la logique de ce programme, et si ça se trouve, tout est à revoir et ces comparaisons de chaînes n'ont pas lieu d'être. C'est possible, c'est dur à dire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Vivi merci beaucoup, je l'avais déjà trouvé comme dit sur la réponse ci dessus.
    C'était bien la fonction equals (mon indice dans la réponse ci dessus vous a mis sur la voie hihi)
    J'ai jamais eu l'utilité de cette fonction car normalement les chaines peuvent sans dire doivent !!!!! être comparées avec ==

    Enfin, je ne suis pas non plus un mega pro du java, mais se prendre la tête 3h sur une méthode bizarroide ...

  6. #6
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Quand tu ecrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m1.get_requete_select() == ""
    tu fait une comparaison entre objets,

    Avec le .equels tu fais un e compraison du contenu

    ce qui n'est pas forcement pareil
    Page sur Developpez : http://pbriand.developpez.com

  7. #7
    Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    pourtant l'intérieur du paramètre get_requete_select me ramène un string
    et " " est considérée comme une string vide
    Voilà pourquoi je ne trouve pas trop logique cette fonction puisqu'avec les outils qu'on dispose, on aurait pu le faire rien qu'avec les ==
    Mais maintenant je saurai que m1.machin == truc va comparer l'objet m1 avec l'objet truc
    Donc si je comprends bien, il faut que j'assimile le "" comme un objet lorsque je le compare avec m1.get_requete_select ?

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    "" est bien un objet. Tu peux d'ailleurs écrire "".equals(m1.get_requete_select). Ainsi tu évites d'avoir une NullPointerException dans le cas ou m1.get_requete_select retourne null

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pour être plus précis, quand dans ton code tu écrit un chaine entre guillement, par exemple

    String a = "bonjour";

    le compilateur, 'en gros' convertis ceci en

    String a = "bonjour".intern();

    interne étant une méthode centralisant les string de ton application pour éviter les duplication. Pas contre, la majorité des string récupérées autrement, par exemple en parsant un fichier, ne sont pas passées explicitement dans cette méthode par le programmeur, pour des raisons de performance. Résultat, on a ce comportement:

    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
     
    String a = "bonjour";
    String b = "bonjour le monde";
    String c = b.subString(0,7); // "bonjour"
     
    if (a == a) 
       System.out.println("fonctionne");
    if (a == c);
       System.out.println("ne fonctionne pas");
    if (a == "bonjour");
       System.out.println("fonctionne");
    if (a == c.intern())
       System.out.println("fonctionne");
    if (c.equals("bonjour"))
       System.out.println("fonctionne");

  10. #10
    Membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour vos réponses

    Passez une bonne journée,

    Cordialement, Baboulinet !

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

Discussions similaires

  1. [bash] Problème de parcours d'array
    Par Jipété dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 05/06/2013, 22h00
  2. [WD18] Problème Parcours de Liste
    Par darkside1993 dans le forum WinDev
    Réponses: 2
    Dernier message: 24/04/2013, 14h02
  3. [Java] Problème de liste vide et de parcours d'arborescence
    Par Sup3rc0c0 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 05/12/2012, 13h54
  4. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10
  5. problème avec les array en pl/pgsql
    Par nico31120 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/03/2005, 16h04

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