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 :

calculs à partir d'un fichier texte


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut calculs à partir d'un fichier texte
    Bonjour,
    j'ai un petit souci avec mon code. ça consiste à calculer des indicateurs à partir des valeurs contenues dans un fichier texte.
    je fais appel donc au fichier, je lie élément par élément et j'insère la méthode qui calcule ces indicateurs. par contre il y a apparement un "return" qui manque, je ne vois pas comment faire, qqu pourrait m'aider?
    Merciii

    Code:

    public double Corr_demog (String [] args)throws IOException
    {

    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    int size_fichier=0;
    String line; /*=null*/
    //ArrayList<String> items = new ArrayList<String>();
    StringTokenizer splitter;
    while ((line = reader.readLine()) != null) {
    size_fichier=size_fichier+1;
    }
    data = new String [size_fichier][5];
    reader = new BufferedReader(new FileReader(filePath));
    int num_ligne=0;
    while ((line = reader.readLine()) != null)
    {

    splitter = new StringTokenizer(line,"|");

    String id = splitter.nextToken();
    //String Age = splitter.nextToken();
    int Age = Integer.parseInt(line);
    //String Sexe = splitter.nextToken();
    int Sexe = Integer.parseInt(line);
    String Profession = splitter.nextToken();
    //String Nat = splitter.nextToken();
    int Nat = Integer.parseInt(line);

    while (splitter.hasMoreTokens())
    {
    for (int i=0;i<5;i++)
    {data[num_ligne][i]=splitter.nextToken();

    double Corr = 0.0;
    double Age_au = 0.0;
    double Sexe_au = 0.0;
    double Nat_au = 0.0;

    int Sex_a = 0;
    int Sex_u = 0;
    int Nat_a = 0;
    int Nat_u = 0;

    int Age_a = 0;
    int Age_u = Age;


    Corr = (Age_au + Sexe_au + Nat_au)/3;

    Age_au = 40 - Math.abs(Age_a - Age_u)/20;
    if (Sex_a == Sex_u)
    {Sexe_au = 1.0;}
    else
    Sexe_au = 0.1;



    if (Nat_a == Nat_u)
    { Nat_au = 2;
    }
    else
    Nat_au = 0.1;

    return Corr;
    }


    }
    num_ligne++;

    }


    }

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Premiere remarque : utilise la balise code(symbole #), c'est plus lisible.

    Si tu crees une methode qui retourne un double, ta methode doit renvoyer quelque chose dans tous les cas de figures.
    Donc ecris un return qqch a la fin de ta methode.

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut calculs à partir d'un fichier texte
    Merci pour ta réponse.
    un return ça peut être un return quoi par exp? sachant que juste avant j'en ai déja inséré un.

  4. #4
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    si tu declares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public double ta_methode ...
    tu dois renvoyer un double.

    de toute façon, tu peux (et meme tu dois) ecrire plusieurs return dans une methode qui a plusieurs conditions.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public String uneMethode(int x){
    if (x==0)
        return "egal a zero";
    else
        return "different de zero";
    }

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut calculs à partir d'un fichier texte
    j'ai compris le principe de nécessité de faire un return à la fin si on a "public double nommethode..."
    mais dans mon cas, j'ai fait plusieurs tests mais j'arrive pas à le faire encore

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Voici quelques modifs de ton code qui te permettront, je l'espère, d'avancer (codé en java 1.5 ou supérieur):
    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
    57
     
    public double Corr_demog(String filePath) throws IOException {
        double Corr = 0.0;
     
        // Creation d'un scanner pour lire le fichier
        Scanner scanner = new Scanner(new File(filePath)).useDelimiter("\\|");
     
        // La liste des objets lus dans le fichiers
        List<MyObject> data = new ArrayList<MyObject>();
     
        while (scanner.hasNext()) {
          // Creation d'un nouvel objet
          MyObject myObject = new MyObject();
     
          // Valorisation des champ de l'objet
          myObject.setId(scanner.next());
          myObject.setAge(scanner.nextInt());
          myObject.setSexe(scanner.nextInt());
          myObject.setProfession(scanner.next());
          myObject.setNat(scanner.nextInt());
     
          // Ajout de l'objet à la liste
          data.add(myObject);
        }
     
        // Pour chaque objet 
        for (MyObject object : data) {
     
          double Age_au = 0.0;
          double Sexe_au = 0.0;
          double Nat_au = 0.0;
     
          int Sex_a = 0;
          int Sex_u = 0;
          int Nat_a = 0;
          int Nat_u = 0;
     
          int Age_a = 0;
          int Age_u = object.getAge();
     
          Corr = (Age_au + Sexe_au + Nat_au) / 3;
     
          Age_au = 40 - Math.abs(Age_a - Age_u) / 20;
          if (Sex_a == Sex_u) {
            Sexe_au = 1.0;
          } else
            Sexe_au = 0.1;
     
          if (Nat_a == Nat_u) {
            Nat_au = 2;
          } else
            Nat_au = 0.1;
     
        }
     
        return Corr;
      }
    J'avoue que je n'ai pas compris le traitement que tu fais aux données lues dans le fichier.
    Au passage, tu peux sans doute traiter les données au fur et à mesure que tu les lis sans passer par la création d'une liste de MyObject. Cette classe, MyObject n'est en fait qu'un simple agrégat des différents champs que tu lis dans le fichier.

  7. #7
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Citation Envoyé par flora806
    j'ai compris le principe de nécessité de faire un return à la fin si on a "public double nommethode..."
    mais dans mon cas, j'ai fait plusieurs tests mais j'arrive pas à le faire encore
    Alors je ne comprends pas ce qui te pose problème.

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut prb avec le get et le set
    Bonjour,
    Merci pour ta réponse.
    je viens d'insérer le code que tu m'as envoyé pour voir ce que ça donne et là il y a un souci avec les méthodes get et set, même si j'ai importé les paquages nécessaires.
    ****
    import java.io.File;
    import java.io.IOException;
    import java.util.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    ****
    pour répondre à ta question, ce que je veux faire exactement c'est lire le fichier texte qui est ss forme de "Id|age|sexe|profession|CP"
    j'ai besoin de calculer des indicateurs à partir de l'age, le sexe et le CP
    --> Indicateur "Corr"
    le calcul se fait apr exp pour l'utilisateur N°1 avec chacun des autres utilisateurs et j'ai besoin après d'afficher et de stocker le résultat trouvé pour chaque ligne.
    je suis encore une débutante, c pour ça que j'ai besoin de l'aide plzz

    Merci.

    Citation Envoyé par Fifan31
    Voici quelques modifs de ton code qui te permettront, je l'espère, d'avancer (codé en java 1.5 ou supérieur):
    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
    57
     
    public double Corr_demog(String filePath) throws IOException {
        double Corr = 0.0;
     
        // Creation d'un scanner pour lire le fichier
        Scanner scanner = new Scanner(new File(filePath)).useDelimiter("\\|");
     
        // La liste des objets lus dans le fichiers
        List<MyObject> data = new ArrayList<MyObject>();
     
        while (scanner.hasNext()) {
          // Creation d'un nouvel objet
          MyObject myObject = new MyObject();
     
          // Valorisation des champ de l'objet
          myObject.setId(scanner.next());
          myObject.setAge(scanner.nextInt());
          myObject.setSexe(scanner.nextInt());
          myObject.setProfession(scanner.next());
          myObject.setNat(scanner.nextInt());
     
          // Ajout de l'objet à la liste
          data.add(myObject);
        }
     
        // Pour chaque objet 
        for (MyObject object : data) {
     
          double Age_au = 0.0;
          double Sexe_au = 0.0;
          double Nat_au = 0.0;
     
          int Sex_a = 0;
          int Sex_u = 0;
          int Nat_a = 0;
          int Nat_u = 0;
     
          int Age_a = 0;
          int Age_u = object.getAge();
     
          Corr = (Age_au + Sexe_au + Nat_au) / 3;
     
          Age_au = 40 - Math.abs(Age_a - Age_u) / 20;
          if (Sex_a == Sex_u) {
            Sexe_au = 1.0;
          } else
            Sexe_au = 0.1;
     
          if (Nat_a == Nat_u) {
            Nat_au = 2;
          } else
            Nat_au = 0.1;
     
        }
     
        return Corr;
      }
    J'avoue que je n'ai pas compris le traitement que tu fais aux données lues dans le fichier.
    Au passage, tu peux sans doute traiter les données au fur et à mesure que tu les lis sans passer par la création d'une liste de MyObject. Cette classe, MyObject n'est en fait qu'un simple agrégat des différents champs que tu lis dans le fichier.

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Si tu dois calculer, afficher et mémoriser une valeur pour chaque ligne, quelle valeur retourne ta méthode ?

    Les getXXX et setXXX sont ce qu'on nomme des accesseurs et mutateurs. Ce sont des méthodes permettent d'obtenir/modifier la valeur de champs d'une classe. On parle "d'encapsulation": les champs sont privés et on y accède en lecture/ecriture avec les méthode getXXX et setXXX.
    Dans le code que je t'ai donné, ils permettent d'accéder aux champs de la classe MyObject. Il te faut créer cette classe.

  10. #10
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut get & set
    je viens de faire des recherches sur ces deux méthodes, j'ai compris leur principe. j'ai bien créé la classe MyObject.
    au niveau du code que tu m'as passé, voilà les lignes qui posent encore prb:

    myObject.setId(scanner.nextInt());
    myObject.setAge(scanner.nextInt());
    myObject.setSexe(scanner.nextInt());
    myObject.setProfession(scanner.next());
    myObject.setNat(scanner.nextInt());

    et

    int Age_u = object.getAge();

    je pense que c'est dû à la syntaxe et set et get (l'erreur marquée: méthode getAge() : "cannot find symbol")

    pour revenir au calcul, la méthode retourne la valeur "Corr", mon objectif et de calculer l'indicateur Corr de l'utilisateur (ID:1) avec chacun des autres utilisateurs et stocker le résultat.

    Citation Envoyé par Fifan31
    Si tu dois calculer, afficher et mémoriser une valeur pour chaque ligne, quelle valeur retourne ta méthode ?

    Les getXXX et setXXX sont ce qu'on nomme des accesseurs et mutateurs. Ce sont des méthodes permettent d'obtenir/modifier la valeur de champs d'une classe. On parle "d'encapsulation": les champs sont privés et on y accède en lecture/ecriture avec les méthode getXXX et setXXX.
    Dans le code que je t'ai donné, ils permettent d'accéder aux champs de la classe MyObject. Il te faut créer cette classe.

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Citation Envoyé par flora806
    j'ai bien créé la classe MyObject
    Il ne suffit pas de créer la classe, il faut aussi implémenter ses méthodes.
    Comme je te l'ai dit:
    Citation Envoyé par fifan31
    Cette classe, MyObject n'est en fait qu'un simple agrégat des différents champs que tu lis dans le fichier.
    Voici donc cette 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
    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
    	public class MyObject() {
    		private int id;
    		private int age;
    		private int sexe;
    		private String profession;
    		private int nat;
     
    		/**
                     * Constructeur de la classe MyObject.
                     */
    		public MyObject() {
    			super();
    		}
     
    		public int getAge() {
    			return age;
    		}
     
    		public void setAge(int age) {
    			this.age = age;
    		}
     
    		public int getId() {
    			return id;
    		}
     
    		public void setId(int id) {
    			this.id = id;
    		}
     
    		public int getNat() {
    			return nat;
    		}
     
    		public void setNat(int nat) {
    			this.nat = nat;
    		}
     
    		public String getProfession() {
    			return profession;
    		}
     
    		public void setProfession(String profession) {
    			this.profession = profession;
    		}
     
    		public int getSexe() {
    			return sexe;
    		}
     
    		public void setSexe(int sexe) {
    			this.sexe = sexe;
    		}
     
    	}

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    J'oubliais le calcul. Un truc de ce genre devrait faire l'affaire:
    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
     
         // Initialisation des variables avant d'entrer dans la boucle pour conserver leur valeur d'une itération à l'autre
          double Age_au = 0.0;
          double Sexe_au = 0.0;
          double Nat_au = 0.0;
     
          int Sex_a = 0;
          int Sex_u = 0;
          int Nat_a = 0;
          int Nat_u = 0;
     
          int Age_a = 0;
        // Pour chaque objet 
        for (MyObject object : data) {
     
          int Age_u = object.getAge();
     
          Corr = (Age_au + Sexe_au + Nat_au) / 3;
     
          Age_au = 40 - Math.abs(Age_a - Age_u) / 20;
          if (Sex_a == Sex_u) {
            Sexe_au = 1.0;
          } else
            Sexe_au = 0.1;
     
          if (Nat_a == Nat_u) {
            Nat_au = 2;
          } else
            Nat_au = 0.1;
     
        }
    Par contre, tu ne fais jamais évoluer Sexe_u, Sexe_a, Nat_a et Nat_u ?

  13. #13
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut encore pb return
    merci Fifan 31,
    j'ai testé ton code et ça marche.
    par contre j'ai encore un petit souci, cette fois c'est avec un "return" qui manque.
    je sais qu'avec la méthode "public double Corr_demog(String filePath) throws IOException", il faut retourner un résultat à la fin.
    j'ai bien mis un "return Corr" à la fin, mais ça n'a pas l'air suffisant

    public double Corr_demog(String filePath) throws IOException {
    double Corr = 0.0;

    // Creation d'un scanner pour lire le fichier
    Scanner scanner = new Scanner(new File(filePath)).useDelimiter("|" );

    // La liste des objets lus dans le fichier
    List<MyObject> data = new ArrayList<MyObject>();

    while (scanner.hasNext()) {
    // Creation d'un nouvel objet
    MyObject myObject = new MyObject();

    // Valorisation des champ de l'objet
    int id = scanner.nextInt();
    int Age = scanner.nextInt();
    int Sexe = scanner.nextInt();
    String Profession = scanner.next();
    int Nat = scanner.nextInt();

    // Ajout de l'objet à la liste
    data.add(myObject);
    }

    // Pour chaque objet
    for (MyObject object : data) {

    double Age_au = 0.0;
    double Sexe_au = 0.0;
    double Nat_au = 0.0;

    int Sex_a = 0;
    int Sex_u = 0;
    int Nat_a = 0;
    int Nat_u = 0;

    int Age_a = 0;
    int Age_u = object.getAge();

    Corr = (Age_au + Sexe_au + Nat_au) / 3;

    Age_au = 40 - Math.abs(Age_a - Age_u) / 20;
    if (Sex_a == Sex_u)
    {
    Sexe_au = 1.0;
    }
    else
    Sexe_au = 0.1;

    if (Nat_a == Nat_u) {
    Nat_au = 2;
    }
    else
    Nat_au = 0.1;

    return Corr;
    }
    --------

    comment je fais alors

  14. #14
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    D'abrod, pense à utiliser la balise CODE en cliquant sur le '#'.

    Sinon, ton pb vient d'un pb d'accolades. Le return est dans le for !
    Il te faut le mettre à l'extérieur du for pour 2 raisons
    1. Si data est une liste vide, on ne rentre pas dans le for et donc ta méthode ne retourne rien CQFD
    2. Si ca compilait malgré tout, tu sortirais de ta méthode dès la première itération !

  15. #15
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut return
    oui, c'était effectivement un problème avec la position du return par rapport à la boucle.
    merci

  16. #16
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Par défaut conseil
    ma chere flora je te conseil de choisire un editeur puissant comme eclipse qui peux t'aider un peux dans tes traitements de code

  17. #17
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut problème d'output
    j'utilise pour l'instant Netbeans, j'ai Eclipse aussi sur ma machine, je le testerai aussi.
    sinon, j'arrive tjr pas à afficher mes résultats de calcul de l'indicateur Corr.

    HELP

Discussions similaires

  1. ajout de données à partir d'un fichier texte
    Par drakenzara dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 14/04/2006, 12h39
  2. Réponses: 4
    Dernier message: 26/01/2006, 12h03
  3. Lancer des commandes dos à partir d'un fichier texte
    Par tpdm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/08/2005, 16h56
  4. état à partir d'un fichier texte
    Par onkel dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/07/2005, 10h26
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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