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 :

Comparer 2 listes


Sujet :

avec Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut Comparer 2 listes
    Bonjour,

    Je tient tous d'abord à préciser que je début en JAVA, et que je n'ai encore rien codé en ce qui concerne mon problème, je recherche juste 1 ou des points de vue différents du mien.

    Je cherche à comparer l'enregistrement dans un fichier (surement txt) du listing d'un répertoire fait le jour j-15 avec une information du type "traité" ou "pas traité", avec celui fait le jour j en récupérant mes infos sur le traitement bien sur.

    Suis pas bien clair là!!! Un exemple s'impose.

    Le jour j-15 le répertoire contenait:
    fichier a
    fichier c
    fichier e
    ...
    J'ai traité a et c donc mon fichier de synthèse contient:
    fichier a traité
    fichier c traité
    fichier e pas traité

    Puis vient le jour j où je n'aimerait pas retraité les fichier a et c, mais en plus mon répertoire contient maintenant:
    fichier a
    fichier b
    fichier c
    fichier d
    fichier e
    ...

    Je tient à préciser que mon répertoire ne peut que s'incrémenter en terme de fichiers, et que b et d sont intercalés à cause du tri alphabétique de l'OS.

    Je pensais donc faire une double boucle imbriquer, assez lourd comme algo. Ne connaissant pas toutes les subtilités de JAVA, je m'en remets à vous pour savoir si une autre méthode est possible.

    d'avance merci

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    C'est effectivement la solution, en java tu masquer l'implémentation de ta deuxième boucle avec la méthode contains(Object o).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Object o : objects) {
        if(!listeObjetsDejaTraites.contains(o)) {
            // traiter o
        }
    }

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Merci bcp darkxan,
    je vient de me renseigner sur la méthode contains et c'est exactement ce que je recherchais.
    Encore merci. Je marquerais comme résolu une fois le code tapé. Et oui on m'a appris la prudence...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut questions.
    Bonsoir,
    Qu'est ce qui garantit que les nouveaux fichiers ne viendront pas ecraser les fichiers déjà traités (même nom)?
    Qu'est ce qui interdit de renommer les fichiers traités (ex: fichier.txt devient fichier.txt_traite après)? Cela peut eviter de traiter une liste de fichier 'à part'.
    A défaut on pourrait sélectionner les fichiers crées ou modifiés depuis la dernière opération.
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Bonjour wiztricks, oui c'est une solution de renommer les fichiers déjà traités, mais dans mon cas le répertoire auquel j'accède n'est qu'en écriture pour ne pas endommager les données. De nouvelles données, différentes, sont placés sur ce répertoire à intervale régulier. J'enregistre les résultats de mes traitement dans un autre répertoire.

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par Rodinia Voir le message
    dans mon cas le répertoire auquel j'accède n'est qu'en écriture pour ne pas endommager les données.
    J'ai peur de ne pas comprendre... Un répertoire en "écriture" permet la suppression, le renommage, la modification, etc. (qui sont des écritures). Il n'existe pas (nativement) de mode de protection qui ne permette que de rajouter de nouveaux fichiers dans un répertoire.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par Rodinia Voir le message
    Bonjour wiztricks, oui c'est une solution de renommer les fichiers déjà traités, mais dans mon cas le répertoire auquel j'accède n'est qu'en écriture pour ne pas endommager les données. De nouvelles données, différentes, sont placés sur ce répertoire à intervale régulier. J'enregistre les résultats de mes traitement dans un autre répertoire.
    Bonjour,
    Les données sont dans des fichiers et le nom des fichiers sont des meta-données. Mais je comprend que tu ne puisses les changer.

    Comment établis-tu que le fichier toto.txt a déjà été traité?
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Bonjour,

    Citation Envoyé par CyberChouan Voir le message
    J'ai peur de ne pas comprendre... Un répertoire en "écriture" permet la suppression, le renommage, la modification, etc. (qui sont des écritures). Il n'existe pas (nativement) de mode de protection qui ne permette que de rajouter de nouveaux fichiers dans un répertoire.
    En effet, je pensais au mode "lecture seule", mode dans lequel est le répertoire qui contient les données que je veux traiter.

    J'ai réussi à codé un truc de cette façon (peut-être pas la meilleur):
    - Je liste le contenu du répertoire que j'enregistre dans un ArrayList1

    - Je lis mon fichier txt qui contient le contenu de ce répertoire plus une info sur le traitement, lors du précédent traitement. Au pire le fichier txt contient la même liste (si on néglige l'info traitement) que ArrayList1 puisque dans mon cas, on ne fait que des ajouts de fichiers dans ce répertoire (avec les droits en écriture bien sur ;-) ), jamais de suppression. Je sauve tous ça dans un ArrayList2. Petite précision utile pour la suite, ces fichiers ont tous la même taille en terme de longueur de nom.
    Mon fichier txt contient un truc du style
    fichier00001 traité
    fichier00002
    fichier00003 traité
    ...

    - Dans une boucle "for" sur la taille de ArrayList2, je regarde si il y a des commentaires en comparant les longueurs de nom avec un nom de ArrayList1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // commentaire = 0 --> pas de commentaire
    // commentaire > 0 --> il y a des commentaires
    int commentaire = ArrayList2.get(i).length() - ArrayList1.get(0).length();
    L'indice de fin du nom du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int indexFin = ArrayList2.get(i).length() - commentaire;
    et enfin l'indice de position dans ArrayList1, de la présence des mêmes fichiers dans les 2 ArrayList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList3.add(ArrayList1.lastIndexOf(ArrayList2.get(i).substring(0, indexFin)))
    puis grâce à tous ça,je construis un 4eme ArrayList qui contient la même chose que ArrayList2 (données du fichier txt) aux indices précédemment trouvés, sinon les données de ArrayList1, tous ça avec une boucle "for" sur la taille de ArrayList1.


    Ouff...
    Cette méthode est lourde, j'essaie donc de tous faire en 1 seule boucle.

    En tous cas merci à vous, et particulièrement à darkxan pour m'avoir mis sur une voie que j'espère être la bonne.

  9. #9
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Salut,

    ce que je ne comprends pas trop, c'est pourquoi dans ton fichier texte tu stockes les noms des fichiers qui n'ont pas été traités ? Il ne serait pas mieux de stocker uniquement les fichiers qui ont déjà été traités ?

    Ensuite, j'ai un peu de mal à comprendre pourquoi tu te bases sur la longueur de la chaîne de caractère. Je pense que le plus simple, si tu veux garder ton système (file_name traité), ça serait d'utiliser split(" ") si les noms de fichiers ne contiennent pas d'espace. Cela te permettrait d'avoir des tailles variables pour les noms de tes fichiers. Tu pourrais aussi utiliser un caractère spéciale comme @ ou quelque chose et cela marcherait aussi bien.

    Je ne comprends pas non plus pourquoi tu construits une troisième liste (qui contient les fichiers non traités ?) alors que tu pourrais faire ça directement. Voir mon premier message.

    A plus.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Salut,

    Je stocke aussi les noms des fichiers non traités pour avoir une synthèse de ce qui à été traité ou pas.

    Bon là je viens de refaire entièrement la class avec une double boucle inbriquée

    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
    import java.util.ArrayList;
     
    public class TraitementsListes {
    	// Variable de la classe
    	ArrayList<String> listePourTraitement = new ArrayList<String>();
     
    	public TraitementsListes(ArrayList<String> listeServeur, ArrayList<String> listeFichier){
     
    		// On compare les 2 listes mais pour cela il faut enlever les commentaires de la
    		// liste listeFichier. On repère les commentaires en comparant la longueur de la listeFichier
    		// à celle de listeServeur à l'indice 0.
     
    		for(int i=0; i<listeServeur.size(); i++){
     
    			for(int ii=0; ii<listeFichier.size(); ii++){
    				// commentaire = 0 --> pas de commentaire
    				// commentaire > 0 --> il y a des commentaires
    				int commentaire = listeFichier.get(ii).length() - listeServeur.get(0).length();
    				int indexFin = listeFichier.get(ii).length() - commentaire;
     
     
    				if(listeServeur.get(i).equals(listeFichier.get(ii).substring(0, indexFin))){
    					// Les 2 chaines sont identiques, cad que le fichier lister sur le serveur est déjà
    					// présent dans le fichier txt. On copie donc la ligne du fichier txt dans la
    					// liste à traité, et on passe au suivant.
    					listePourTraitement.add(listeFichier.get(ii));
    					break;
    				}
     
    				if(ii == listeFichier.size()-1){
    					// Pas d'occurrence trouvée, on copie donc la ligne du fichierServeur dans la
    					// liste à traité.
    					listePourTraitement.add(listeServeur.get(i));
    				}
     
    			}
    		}
     
    	}
     
    	public ArrayList<String> getList(){
    		return listePourTraitement;
    	}
     
    }
    Ca m'a pas mal le split(" ").

    Je ne comprends pas non plus pourquoi tu construits une troisième liste (qui contient les fichiers non traités ?) alors que tu pourrais faire ça directement. Voir mon premier message.
    J'étais perdu au milieu de mes listes, une petite pose plus tard, je n'en avais plus besoin!

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

Discussions similaires

  1. Comparer deux listes
    Par timtim2007 dans le forum Prolog
    Réponses: 7
    Dernier message: 07/06/2019, 09h02
  2. comparer une liste de valeur
    Par jfcb92 dans le forum Excel
    Réponses: 4
    Dernier message: 14/11/2007, 08h36
  3. Comparer x listes de x serveurs
    Par MaitrePylos dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2007, 09h58
  4. [C# 2.0] Comparer deux listes
    Par Rodie dans le forum Windows Forms
    Réponses: 4
    Dernier message: 01/08/2006, 00h40
  5. Comparer des listes de prix
    Par denisfavre dans le forum Access
    Réponses: 8
    Dernier message: 08/11/2005, 20h11

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