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

Collection et Stream Java Discussion :

Structure Arraylist vide


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut Structure Arraylist vide
    Bonsoir

    Je veux faire un programme qui à partir d'un fichier lit pour chaque étudiant (identifié par un numéro studentID) les différents score obtenus,
    donc on un fichier qui contient par exemple:

    1 Q0 DerOpthalmologe/80950033 0 5.960979448916666
    1 Q0 DerRadiologe/80380710 1 5.836199971080442
    1 Q0 MonatsschriftKinderheilkunde/01480013 2 5.836199971080442
    2 Q0 DerUnfallchirurg/81010830 2 7.503564829783422
    2 Q0 DerChirurg/80690854 3 7.503564829783422
    2 Q0 DerChirurg/60671226 4 6.176200952599098
    ....
    Le programme doit identifier le numéro de l'étudiant qui est le premier numéro de la ligne, j'utilise un split et collecter la liste des score obtenus dans pour calculer la somme ou une moyenne... ( le sore c'est le 4ème champ , le dernier numéro)

    j'ai trouvé un code que j'ai voulou adpater qui utilise différente classe, mais ca ne marche pas.

    1 ère classe loader qui lit le fichier:

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    /*
     
    package query;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
     
     
    public class Loader {
      
     
     
    /**
     *
     * @author 
     */
    public static ArrayList<Student> loadStudentsData() throws FileNotFoundException, UnsupportedEncodingException, IOException {
     
     
     
            String fichier ="C:/normalisation/file.res";
        	String fichier2 ="C:/normalisation/res";
     
     
            ArrayList<Student> studentsCollection = new ArrayList<Student>(100);
     
            BufferedReader br = new BufferedReader(new InputStreamReader(new java.io.FileInputStream(fichier), "UTF-8"));
        			String ligne;
                            String  recordLine = new String();
                    String lineItems[] = new String[3];
     
                            Student Element = new Student();
                         StudentTest studenTest = new StudentTest();
            while ((ligne=br.readLine())!=null){
     					String test = ligne;
     					System.out.println(test);
            lineItems = ligne.split(" ")   ;
            System.out.println(lineItems[0]+"\n");
     
     
     
     
     
     
                         System.out.println( lineItems[0]  + " " + lineItems[1] + " " + lineItems[2] );
                         Element.setStudentID( Integer.parseInt(lineItems[0]) ); // second item is ID
     
                         int index ;
     
                          if (  (index = studentsCollection.indexOf(Element) ) > -1  ) {
     
                             Element = studentsCollection.get(index);
                             System.out.println("test : "+studentsCollection.indexOf(Element)+"\n");
     
                         }
                          studenTest.setTestDate(Integer.parseInt(lineItems[0]));
     
                          studenTest.setTestScore( Float.parseFloat(lineItems[4] )  );
     
                          Element.addStudentTest(studenTest);
     
     
     
                         if ( index == -1)  {
                             studentsCollection.add(Element);
                         }
            }
       return studentsCollection;     
     }   
     
    }
    2ème classe student:
    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
    58
    59
    60
    /*
     
     */
    package query;
     
     
     
    import java.util.ArrayList;
     
    /**
     *
     * @author 
     */
    public class Student {
     
     
     
    /*
     * This is the main student class to hold each record entry
     * 
     */
     
     
            private int studentID;
            private ArrayList<StudentTest> testsCollections ;  
     
            public Student() {
                testsCollections  = new ArrayList<StudentTest>();
            }
            public void setStudentID(int id) {
                this.studentID = id;
            }
     
            public int getStudentID() {
                return this.studentID  ;
            }
     
            public void addStudentTest(StudentTest test) {
     
                this.testsCollections.add(test);
            }
     
            public ArrayList<StudentTest> getStudentTestsCollection() {
                return this.testsCollections  ;
            }
     
            @Override
            public boolean equals(Object v) {
     
                return this.studentID == ((Student)v).studentID ;
            }
     
     @Override
            public int hashCode() {
                int hash = 5;
                hash = 89 + hash + (this.testsCollections != null ? this.testsCollections.hashCode() : 0);
                hash += 89 + hash + this.studentID;
                return hash;
            }
    }
    3ème classe qui contient aussi les scores:
    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
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package query;
     
     
    public class StudentTest {
     
     
     
    /*
     * This student Test class hold record details by id and score
     * 
     */
     
     
        private int idi;
        private double score;
     
        public void setTestId(int idi) {
            this.date = date;
        }
     
        public int getTestId() {
            return this.idi ;
        }
     
        public void setTestScore(double score) {
            this.score = score;
        }
     
        public double getTestScore() {
            return this.score  ;
        }
     
    }
    classe searchresult qui fait le calcul:
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package query;
     
     
     
        import java.util.TreeSet;
     
    /*
     * This class will hold all results score and will return final score
     * 
     */
     
    public class SearchResult implements Comparable{
     
        private int student;
        private TreeSet<Double> scores = new TreeSet<Double>();
     
     
     
        public void setStudentID(int student) {
            this.student = student;
     
        }
     
        public int getStudentID() {
            return this.student  ;
        }
     
        public double getFinalScore() {
     
            Object[] arr = scores.toArray();
            double finalScore = 0;
            int index = 0;
            for(int i=arr.length - 1; i >= 0; i--) {
                finalScore += (double)arr[i];
                System.out.println( "student id "+finalScore );
                index++;
                if( index == 5 ) break;
            }
            return finalScore / index;//
        }
     
        public void addScore(double dl) {
            scores.add(dl);
        }
     
        @Override
        public String toString() {
     
            return this.student + " - " + getFinalScore();
     
        }
     
        @Override
        public boolean equals(Object v) {
     
            return this.student == ((SearchResult)v).student ;
        }
     
        @Override
        public int hashCode() {
            int hash = 5;
            hash = 89 + hash + (this.scores != null ? this.scores.hashCode() : 0);
            hash += 89 + hash + this.student;
            return hash;
        }
     
        @Override
        public int compareTo(Object o) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
     
     
     
    }
    la classe qui cherche les scores selon l'identifiant:

    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
     
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package query;
     
     
     
     
    import java.io.IOException;
        import java.util.ArrayList;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.TreeSet;
     
     
     
    /*
     * This class works as a controller to search records by date and populate Search Results collection
     * 
     */
    public class DataSearchController {
     
     
     
        public static TreeSet<SearchResult> searchStudentScore(int studentID) throws IOException {
            ArrayList<Student> students = Loader.loadStudentsData();
     
            TreeSet<SearchResult> results =new TreeSet<SearchResult>() ;
     
            for(Iterator<Student> iterator = students.iterator() ; iterator.hasNext(); ) {
                 Student st = iterator.next();
                 System.out.println( "student ili"+st.getStudentID());
                 SearchResult  rs =new  SearchResult();
                for( Iterator<StudentTest> testItrator = st.getStudentTestsCollection().iterator(); testItrator.hasNext(); ) {
                    StudentTest stest = testItrator.next();
     
     
                        rs.setStudentID(st.getStudentID());
                        System.out.println( "studenttest "+stest.getTestScore());
                        rs.addScore( stest.getTestScore()  );
     
     
                }
                results.add(rs);
            }
     return results;
        }
    }
    classe qui contient le main et qui cherche le score selon l'dientifant de l'étudiant:
    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
    /*
     
    package query;
     
     
     
     
     
     
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.TreeSet;
     
     
     
    /*
     * Here is the main Class with main method , it is just going to search all loaded recorded and show final results
     * 
     */
    public class Command {
     
        public static void main(String[] arg) throws IOException {
     
     
            TreeSet<SearchResult> sr = DataSearchController.searchStudentScore(2);
     
            for(Iterator<SearchResult> it = sr.iterator(); it.hasNext();) {
                SearchResult st = it.next();
                System.out.println( "opa "+st.getStudentID()  );
            }
     
     
        }
    }
    ce que j'arrive pas à comprendre pourquoi ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return studentsCollection;
    ne retourne rien

    et quel est son utilité puisque qu'il y a aucune instruction dans la classe loader qui remplit cette structure

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Premièrement, la classe Loader ne compile pas, puisque l'entête de déclaration de la classe est en commentaire. Même si on rétablit cette déclaration, et une méthode StudentScore.setTestDate() est appelée, alors qu'elle n'existe pas : la compilation échouera donc aussi.
    Avant de ne nous demander pourquoi la liste retournée est vide, donne nous le code que tu exécutes vraiment.
    Ensuite, indente proprement ton code : c'est déjà difficile à lire à cause du non respect des conventions, mais avec ton indentation horrible, c'est une véritable plaie. Et essaye de nommer tes variables avec sens. Enfin supprime le code superflu pour nous simplifier un peu la tâche. On t'aidera plus facilement si ce n'est pas une corvée !

    Ensuite, si ce code est corrigé, il s'exécute, et la liste retournée par loadStudentsData n'est pas vide : elle contient un seul Student. Et c'est normal.
    Si on simplifie l'exécution pas à pas, ton code fait
    1. créer une instance de Student qui devient le Student courant (variable Element)
    2. commencer la lecture du fichier et lire une ligne
    3. parser la ligne et extraire l'id
    4. affecter l'id au Student courant
    5. chercher un Student ayant le même id dans la liste
    6. si on en trouve un, remplacer le Student courant par celui-ci, qui devient donc le Student courant
    7. sinon ajouter le Student courant à la liste
    8. recommencer en 3 tant qu'il y a des lignes à lire dans le fichier

    Donc on voit que, à part à la première itération, un id lu dans une nouvelle ligne est toujours injecté dans l'instance courante de Student, ce qui modifie celui traité lors de l'itération précédente. Le seul new qui est fait est fait en dehors de la boucle, donc de toute manière, il n'y aucun risque d'en avoir plusieurs !

    Au lieu de faire cette bidouille avec une injection dans une instance courante, et l'indexOf pour trouver l'instance précédente, utilise plutôt une map. Cela te simplifiera grandement ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Integer, Student> studentMap = new LinkedHashMap<>();
    Premièrement, comme il n'y a pas de raison qu'un Student change d'id, et que l'id est indispensable (surtout qu'il est utilisé pour le hashcode), autant écrire
    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
    public class Student {
    	private final int studentID;
    	private final List<StudentTest> testsCollections;
     
    	public Student(int id) {
    		this.studentID = id;
    		testsCollections = new ArrayList<StudentTest>();
            }
     
           	/* A SUPPRIMER public void setStudentID(int id) {
    		this.studentID = id;
    	}*/
     
    	public int getStudentID() {
    		return this.studentID;
    	}
            /* ... */
    }
    Ensuite, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Student student = studentMap.computeIfAbsent(Integer.parseInt(lineItems[0]), id-> new Student(id)); // dans ton code student s'appelle Element !
    Ou en Java 7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    final Student student;
    final int studentId = Integer.parseInt(lineItems[0]);
    if ( studentMap.containsKey(studentId) ) {
         student = studentMap.get(studentId);
    }
    else {
         student = new Student(studentId);
         studentMap.put(studentid, student);
    }
    A la fin de la méthode tu peux toujours retourner une liste par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new ArrayList(studentMap.values());
    Par ailleurs, ferme proprement ton reader !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Merci pour tous vos remarques.

    Je suis débutant en java, donc il y a des choses que je comprends pas très bien, je vais essayer de décomposer le problème.

    Normalement la structure doit contenir la liste de tous les étudiants, mais dans ce code on fait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    studentsCollection.add(Element);
    pour ajouter avec chaque nouvel étudiant la liste de ces scores.

    Car je fais des test dans la classe dataSearchController à l'intérieur de la boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Iterator<Student> iterator = students.iterator() ; iterator.hasNext(); )

    et cet itération n'affiche qu'un seul étudiant!donc on garde toujours le dernier élément
    Alors que l'objectif est d'avoir la liste de tous les étudiants?

    Par la suite je vais tenir compte de vos remarques

    Merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    Merci pour tous vos remarques.

    Je suis débutant en java, donc il y a des choses que je comprends pas très bien, je vais essayer de décomposer le problème.

    Normalement la structure doit contenir la liste de tous les étudiants, mais dans ce code on fait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    studentsCollection.add(Element);
    pour ajouter avec chaque nouvel étudiant la liste de ces scores.

    Car je fais des test dans la classe dataSearchController à l'intérieur de la boucle FORfor(Iterator<Student> iterator = students.iterator() ; iterator.hasNext(); )
    Tu parles de mon code ? Le but de la map est de remplacer studentsCollection pour permettre de pouvoir cumuler plusieurs lignes du fichier qui concernent le même étudiant. C'est beaucoup plus efficace que ta solution avec indexOf(), et beaucoup plus concis aussi. Et moins bidouille.

    Citation Envoyé par africanwinners Voir le message
    et cet itération n'affiche qu'un seul étudiant!donc on garde toujours le dernier élément
    Alors que l'objectif est d'avoir la liste de tous les étudiants?
    On traite un Student par étudiant oui. Mais on traite aussi chaque ligne du fichier : si une ligne correspond à un Student qu'on a déjà créé, on utilise celui-là, sinon on en créé un nouveau.
    Ta solution faisait plutôt, on modifie l'étudiant sur lequel on bosse, on cherche s'il existe déjà dans la collection, si oui on prend celui qui existe déjà. Seulement comme tu n'en créé qu'un seul, c'est toujours le même que tu modifies. Mais même si tu corriges ta solution pour créer un nouvel étudiant à chaque boucle, ça reste bidouille : tu va créés un étudiant juste pour y mettre un id, juste pour chercher s'il existe déjà un étudiant dans la collection. Donc si tu as 2 étudiants, avec 5 lignes chacun, tu créés quand même 10 étudiants, donc 8 pour rien. Si tu as 10000 étudiants dans le fichiers, tu vas créers des milliers d'instances pour rien (et ça va prend des ressources inutiles, consommer du temps....)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Merci j'ai compris qu'on doit créer un étudiant par ID.

    Le code que vous proposez génère des erreures, je sais pas où intégrer ca, j'ai modifié student par Element:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     final Student Element = studentMap.computeIfAbsent(Integer.parseInt(lineItems[0]), id-> new Student(id)); // dans ton code student s'appelle Element !
    je l'ai mis dans la classe loader à l'intérieur du while, mais par la suite le final me génère une erreur car on trouve cette instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element = studentsCollection.get(index);

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Quelles erreurs ? C'est quoi les messages ?

    Tu as bien ajouter la déclaration de map (à la place de studentsCollection qui ne sert plus à rien) ? Si tu as changé student en Element (rappel des convention en Java : les noms de variable doivent commencer par une minuscule. Et le nom de la variable student a plus de sens que Element, mai bon, va pour element), il faut bien sûr supprimer la déclaration que tu avais faite, sinon ça fait 2 variables avec le même nom.

    NB Si tu n'es pas en Java 8, il faut utiliser le second code que j'ai indiqué, car le premier ne compilera pas.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    J'ai vérifié le code, il n' y a pas d'erreurs, désolé, j'ai enlevé quelque ligne..

    Ce que je comprends pas l'utilité de student dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Student student = studentMap.computeIfAbsent(Integer.parseInt(lineItems[0]), id-> new Student(id));
    car student n'est pas utilisé!

    Par la suite dans la classe dataSearchController

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Iterator<Student> iterator = students.iterator() ; iterator.hasNext(); ) {
    iterator ne contient qu'un seul élément ce qui est bizarre

    de plus dans la boucle suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( Iterator<StudentTest> testItrator = st.getStudentTestsCollection().iterator(); testItrator.hasNext(); )
    serchresult ne contient rien

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    J'ai vérifié le code, il n' y a pas d'erreurs, désolé, j'ai enlevé quelque ligne..

    Ce que je comprends pas l'utilité de student dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Student student = studentMap.computeIfAbsent(Integer.parseInt(lineItems[0]), id-> new Student(id));
    car student n'est pas utilisé!
    C'est censé remplacé ton Element ! Que tu l'appelles student (logique), Element (général et non respect de la convention), duschmoll(nul), peu importe.
    Je t'ai pas maché tout le boulot évidemment : tu dois simplement remplacer la construction de ton instance de Student par le système à base de map, le reste, ne devrait pas trop changer (l'injection des autres propriétés entre autres) pour que ça fonctionne.

    Déjà, il faut modifier ta classe Student comme je l'ai écrit (l'id a passer dans le constructeur).

    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
     
    public static ArrayList<Student> loadStudentsData() throws FileNotFoundException, UnsupportedEncodingException, IOException {
     
            String fichier ="C:/normalisation/file.res"; // bon ça j'espère que c'est temporaire, ça devrait être en paramètre et surtout pas en dur
        	String fichier2 ="C:/normalisation/res";
     
            final Map<Integer, Student> studentMap = new LinkedHashMap<>(); // on créé la map
     
            try(BufferedReader br = Files.newBufferedReader(Paths.get(fichier), StandardCharsets.UTF_8)) { // try-with-resource pour le reader soit fermé correctement quand on a fini de l'utiliser
     
                for(String ligne = br.readLine(); ligne!=null; ligne = br.readLine()) {
     
                     final String[] lineItems = ligne.split(" ")   ;
                     final Student student = studentMap.computeIfAbsent(Integer.valueOf(lineItems[0]), id-> new Student(id)); 
     
                     final StudentTest studentTest = new StudentTest(); // l'id pourrait être passé en paramètre ici, comme j'ai montré pour Student
                     studenTest.setTestId(Integer.parseInt(lineItems[3])); // attention toi tu as écrit dans ton code setTestDate(Integer.parseInt(lineItems[0])) !
                     studenTest.setTestScore( Float.parseFloat(lineItems[4] )  ); // on pourrait également le passer en paramètre du contructeur
     
                     student.addStudentTest(studentTest);
     
                }
     
           } 
           return new ArrayList<>(studentMap.values());     
     
    }
    Citation Envoyé par africanwinners Voir le message
    Par la suite dans la classe dataSearchController

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Iterator<Student> iterator = students.iterator() ; iterator.hasNext(); ) {
    iterator ne contient qu'un seul élément ce qui est bizarre
    Bah, c'est normal, si tu utilises toujours ton Element et ton studentsCollection, ça n'a pas changé (explications dans mon premier message).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Merci pour vos réponses.
    J'ai fait les modifications, le code marche, mais il me reste des erreurs que j'ai pas compris:
    Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet.
    at query.SearchResult.compareTo(SearchResult.java:77)
    at java.util.TreeMap.compare(TreeMap.java:1290)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at query.DataSearchController.searchStudentScore(DataSearchController.java:55)
    at query.Command.main(Command.java:31)
    Java Result: 1
    l'erreur SearchResult.java:77 est généré par ces instruction dals la classe searchresult

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      @Override
        public int compareTo(Object o) {
            throw new UnsupportedOperationException("Not supported yet."); 
        }
    je comprends pas la cause

    De plus impossible de traiter tous les étudiants à cause de cette erreur
    query.DataSearchController.searchStudentScore(DataSearchController.java:55)
    donc cette classe génère l'erreur avec l'instruction suivante:
    La classe ne peut pas ajouter des éléments à searchresult et il génère l'erreur et il ne peut traiter qu'un seul étudiant

    Merci

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah la cause de l'erreur c'est que tu as implémenté la méthode compareTo() pour qu'elle fasse cette erreur : ça ne fait rien d'autre que ce que tu demandes.
    Tu dois implémenter compareTo() conformément à la javadoc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Pour éviter tous problème je l'ai éliminer, puisque j'utilise un fichier déjà trier, donc c'est pas neçessaire.

    Mais il reste l'erreur générer par la classe dataSerachControll que je comprends, avec l'instruction suivante
    qui génère ce message d'erreur:

    Exception in thread "main" java.lang.ClassCastException: query.SearchResult cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1290)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at query.DataSearchController.searchStudentScore(DataSearchController.java:55)
    at query.Command.main(Command.java:31)

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Un TreeSet ne peut contenir que des Comparable. Remplace-le par un LinkedHashSet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Bonsoir c'est ce que j'ai fait j'ai remplacer par une Arraylist et ca marche bien .

    Merci pour tous vos remarques et votre aide

  14. #14
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Bonsoir,

    J'ai un autre problème avec mon code, je peux pas créer une autre discussion puisque c'est en rapport avec le même projet et les mêmes classes.

    Je veux à partir de ces classes calculer un nouveau score, basé sur les scores déja enregistrer, mais j'arrive pas.
    ce score est calculé pour chaque ligne, donc on va remplacer chaque score , par un nouveau.
    ce score doit tenir compte du premier score te du dernier score, cette formule est:

    nouveau score= (score-1erscore)/(1erscore-dernierScore)

    ce que j'ai fait dans la classe searchresult, j'ai ajouté "public double getLast()" et "public double geFirst()

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
     
    package query;
     
     
     
     
        import java.util.TreeSet;
     
     
    public class SearchResult {
     
        private int student,number;
        private TreeSet<Double> scores = new TreeSet<Double>();
        private String name,model;
        private double score;
     
     
         public void setName(String name) {
            this.name = name;
        }
     
        public String getName() {
            return this.name  ;
        }
     
         public void setModel(String model) {
            this.model = model;
        }
     
        public String getModel() {
            return this.model  ;
     
     
        }
     
         public void setNumber(int number) {
            this.number = number;
        }
     
        public int getNumber() {
            return this.number  ;
        } 
     
         public void setScorre(double score) {
            this.score = score;
        }
     
        public double getScore() {
            return this.score  ;
        }
     
        public void setStudentID(int student) {
            this.student = student;
     
        }
     
        public int getStudentID() {
            return this.student  ;
        }
     
        public double getFirst() {
            Object[] arr = scores.toArray();
            double first = 0;
            int index=0;
             for(int i=arr.length-1; i >= 0; i--) {
                first += (double)arr[i];
                System.out.println( "first "+first);
                index++;
                if( index == 1 ) break;
            }
     
            return first  ;
        }
     
         public double getLast() {
            Object[] arr = scores.toArray();
            scores.last();
     
            double last = scores.first();
            int index=0;
             for(int i=arr.length-1; i >= 0; i--) {
                last = (double)arr[i];
                //System.out.println( "it "+i);
     
     
            }
           //System.out.println( "last "+last);
            return last  ;
        }
     
        public double getFinalScore(int n) {
     
            Object[] arr = scores.toArray();
            double first,last;
            first=(double)arr[0];
            last=(double)arr[arr.length-1];
            System.out.println( "first "+first+" last "+last);
            double finalScore = 0;
            int index = 0;
     
            //for(int i=arr.length - 1;i>=0;i--){
                finalScore = (double)arr[n];
     
               // System.out.println( "final "+finalScore);
                index++;
     
            //}   
     
            return finalScore ;//
        }
     
     
     
        public void addScore(double dl) {
            scores.add(dl);
        }
     
     
        public boolean equals(Object v) {
     
            return this.student == ((SearchResult)v).student ;
        }
     
        @Override
        public int hashCode() {
            int hash = 5;
            hash = 89 + hash + (this.scores != null ? this.scores.hashCode() : 0);
            hash += 89 + hash + this.student;
            return hash;
        }
     
     
     
     
     
    }
    la fonction ne retourne rien.

    je veux une fonction qui permet de calculer le nouveau score
    j'ai une fonction scorefinal qui peut calculer la somme des score à partir de l'array score


    merci

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    la fonction ne retourne rien.
    Quelle fonction ? Retourne rien : soit une méthode (et pas une fonction) retourne une valeur erronée ou pas, soit elle soulève une exception, soit elle est void, mais retourner rien, ça ne veut rien dire.

    je veux une fonction qui permet de calculer le nouveau score
    j'ai une fonction scorefinal qui peut calculer la somme des score à partir de l'array score


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public double getFirst() {
            Object[] arr = scores.toArray();
            double first = 0;
            int index=0;
             for(int i=arr.length-1; i >= 0; i--) {
                first += (double)arr[i];
                System.out.println( "first "+first);
                index++;
                if( index == 1 ) break;
            }
     
            return first  ;
        }
    avec if( index == 1 ) break;, la boucle ne sert à rien : on fait une seule itération et on sort (index==1 dès après index++). La méthode retourne la dernière valeur puisqu'on parcourt le tableau depuis la fin.


    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
     
     
         public double getLast() {
            Object[] arr = scores.toArray();
            scores.last();
     
            double last = scores.first();
            int index=0;
             for(int i=arr.length-1; i >= 0; i--) {
                last = (double)arr[i];
                //System.out.println( "it "+i);
     
     
            }
           //System.out.println( "last "+last);
            return last  ;
        }
    Là, c'est encore plus n'impore quoi : on lit last() mais on le stocke pas, on lit first() et on le stocke dans last. Puis on lit toutes les valeurs successivement et on les met dans last, donc au final on lit la première. La boucle est totalement inutile. Avant la boucle, last contient dejà la première valeur.

    Au final, on a une méthode getLast() qui retourne le premier et une méthode getFirst() qui retourne le dernier, mais de façon ultra compliquée.
    Pourquoi ne pas faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public double getFirst() {
        return scores.first();
    }
    public double getLast() {
        return scores.last();
    }
    Attention, ces méthodes soulèvent une exception (NoSuchElementException) en cas de set vide : c'est à gérer.

    Tu peux aussi directement écrire ta "fonction" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public double computeScore(double score) {
    return (score-scores.first())/(score.first()-score.last());
    }
    Autre chose à laquelle tu dois faire attention : le calcul va modifier la valeur. Si tu la remplaces dans le TreeSet, l'ordre va être modifié, donc ça rend assez hasardeux le traitement de toutes les valeurs successivement en parcourant le set. Au lieu de remplacer valeur par valeur, il faudrait produire un tableau (ou une liste), puis reconstruire le set en entier à partir du tableau

    Voire générer directement le treeset résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double diff = score.first()-score.last();
    scores = scores.stream().map(score-> (score-scores.first())/diff).collect(Collectors.toCollection(()-> new TreeSet<Double>()));
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Quelle fonction ? Retourne rien : soit une méthode (et pas une fonction) retourne une valeur erronée ou pas, soit elle soulève une exception, soit elle est void, mais retourner rien, ça ne veut rien dire.
    OUi 'était une erreur de ma part, c'est la méthode getScore() qui retourne toujours 0.0, moi j'ai voulou utilisé le score obtenu par chaque ligne, j'ai fait la méthode setScore(double score), d'ailleur la méthode addScore ajoute à chaque fois ce nouveau score, mais j'arrive pas à le lire.

    Citation Envoyé par joel.drigo Voir le message
    je veux une fonction qui permet de calculer le nouveau score
    j'ai une fonction scorefinal qui peut calculer la somme des score à partir de l'array score


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public double getFirst() {
            Object[] arr = scores.toArray();
            double first = 0;
            int index=0;
             for(int i=arr.length-1; i >= 0; i--) {
                first += (double)arr[i];
                System.out.println( "first "+first);
                index++;
                if( index == 1 ) break;
            }
     
            return first  ;
        }
    avec if( index == 1 ) break;, la boucle ne sert à rien : on fait une seule itération et on sort (index==1 dès après index++). La méthode retourne la dernière valeur puisqu'on parcourt le tableau depuis la fin.


    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
     
     
         public double getLast() {
            Object[] arr = scores.toArray();
            scores.last();
     
            double last = scores.first();
            int index=0;
             for(int i=arr.length-1; i >= 0; i--) {
                last = (double)arr[i];
                //System.out.println( "it "+i);
     
     
            }
           //System.out.println( "last "+last);
            return last  ;
        }
    Là, c'est encore plus n'impore quoi : on lit last() mais on le stocke pas, on lit first() et on le stocke dans last. Puis on lit toutes les valeurs successivement et on les met dans last, donc au final on lit la première. La boucle est totalement inutile. Avant la boucle, last contient dejà la première valeur.

    Au final, on a une méthode getLast() qui retourne le premier et une méthode getFirst() qui retourne le dernier, mais de façon ultra compliquée.
    Pourquoi ne pas faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public double getFirst() {
        return scores.first();
    }
    public double getLast() {
        return scores.last();
    }


    Attention, ces méthodes soulèvent une exception (NoSuchElementException) en cas de set vide : c'est à gérer.
    Vous avez tout a fait raison concernant ce que j'ai fait getFirst() et getLast(), c'est mal écrit.
    le problème avec scores.first() c'est qu'elle retourne toujours le dernier élément ajouté à scores, alors que mon objectif est de calculer le dernier après l'ajout de tous les élément et non un résultat provisoire.

    C'est à dire à chaque fois la méthode addScore(double dl) ajoute un nouvel élement et le first et le last sont calculé selone la nouvelle liste scores.
    Y a t-il pas un autre moyen d'avoir la liste complète des scores et par la suite extraire le 1er et el dernier qui sont le maximum et le minum puisque la liste en entrée est triée?

    Merci bien.

  17. #17
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    J'ai trouvé un solution pour pouvoir avoir les getFirst() et getLast() finaux, et cela faisant l'appel de getlast et getfirst après la fin du traitments de toute les lignes et ainsi pouvoir faire le calcul correcte, mais il me reste des problèmes,

    J'utilise la classe commande qui est la suivante

    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
    /*
     
    package query;
     
     
     
     
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.TreeSet;
     
     
     
    public class Command {
     
        public static void main(String[] arg) throws IOException {
     
     
            ArrayList<SearchResult> sr = DataSearchController.searchStudentScore( );
     
     
      
            int number=0;// ce numéro je l'utilise pour pouvoir calculer le score selone le numéro de la ligne 
            for(Iterator<SearchResult> it = sr.iterator(); it.hasNext();) {
                SearchResult st = it.next();
                
                
               System.out.println( st.getStudentID()+" "+st.getNumber()+" name "+st.getName()+" score "+st.getFinalScore(number) +" so "+st.computeScore(st.getFinalScore(number))+" "+st.getScore() );
               number++;
               if(number==st.getNumber()){number=0;}
            }
     
     
        }
    }
    ce code génère des erreurs:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 17
    at query.SearchResult.getFinalScore(SearchResult.java:115)
    at query.Command.main(Command.java:43)

    J'arrive à calculer les nouveaux score, mais j'arrive pas à afficher les noms (getName()) , les anciens scores (getScore()), la même valeur est affiché, malgré que j'ai enregistré plusieurs

    Merci

  18. #18
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Merci pour tous ces pointeurs et toutes ces corrections, mon programme fonctionne correctement maintenant.

    Le problème était que je garde qu'une seule valeur, alors j'ai utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void addName(String name) {
            names.add(name);
        }
    Donc tous les nomes sont enregistré dans une arrayList, et bien sur j'ai utlisé un getName().

    de plus dans la classe principale j'ai fait:
    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
    /*
     
     
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.TreeSet;
     
     
     
    /*
     * Here is the main Class with main method , it is just going to search all loaded recorded and show final results
     * 
     */
    public class Command {
     
        public static void main(String[] arg) throws IOException {
    File file =new File("C:/normalisation/res");
     
    FileWriter fw = new FileWriter(file.getAbsoluteFile());
    			BufferedWriter bw = new BufferedWriter(fw);
     
            ArrayList<SearchResult> sr = DataSearchController.searchStudentScore(3);
     
     ArrayList<Student> students = Loader.loadStudentsData();
     
     
     
    int number=0;
            for(Iterator<SearchResult> it = sr.iterator(); it.hasNext();) {
                SearchResult st = it.next();
     
     
               bw.write( st.getStudentID()+" Q0 "+st.getFinalName(number)+" "+number+" "+st.computeScore(st.getFinalScore(number))+" "+st.getModel() );
               System.out.println( st.getStudentID()+" Q0 "+st.getFinalName(number)+" "+number+" "+st.computeScore(st.getFinalScore(number))+" "+st.getModel() );
     
               bw.write("\n"); 
               number++;
               if(number==st.getNumber()+1){number=0;}
            }
     
     
        }
    }
    Merci pour votre temps.

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

Discussions similaires

  1. Problème inconnu (peut être ArrayList vide)
    Par Eausport dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 03/08/2012, 11h30
  2. Serialization ArrayList Vide
    Par vinci.novice dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 27/04/2011, 01h49
  3. [structures] Erreur structure vide
    Par emi3113 dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/07/2007, 19h36
  4. Réponses: 5
    Dernier message: 09/07/2006, 19h40
  5. [Cocoon] Structure d'un projet vide ?
    Par rozwel dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 13/03/2005, 20h12

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