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

Entrée/Sortie Java Discussion :

Fichier texte / tri / affichage


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Par défaut Fichier texte / tri / affichage
    Bonjour ,

    J'ai quelques soucis pour réaliser mon objectif qui est d'afficher dans un tableau (jTable)
    pseudo / score , trier par score du plus grand au plus petit , une liste de pseudo et score .

    Tout d'abord , j'ecris dans un fichier texte mon pseudo et mon score , ensuite je lis ce fichier texte , je recupere les données et je les stocke dans un ArrayList.

    Mon soucis c'est que je n'arrive pas à faire de tri sur le score du fait que mon tri ce fait sur la chaine de caractere pseudo + score .

    Je vous met le code de tout ce qui peut etre utile . Si vous avez besoin de plus d'elements je vous les fournirai .


    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
    class Lireetecrire{
     
                public void ecrire(String texte){
     
                String adressedufichier = System.getProperty("user.dir") + "\\monfichier.txt";
     
                try{
     
     
                FileWriter fw = new FileWriter(adressedufichier, true);
     
                BufferedWriter output = new BufferedWriter(fw);
     
                output.write(texte);
     
                output.flush();
     
                output.close();
     
                }
                catch(IOException ioe){System.out.println("erreur : " + ioe );}
     
                }
     
                public void lire(){
                	 String name = "monfichier.txt";
     
                	 List<String> list = new ArrayList<String>();
     
                	 try{
     
                	     Scanner s = new Scanner(new FileReader(new File(name)));
                	     while(s.hasNext())
                	     {         
                	    	list.add((s.nextLine()));            	    	          	                	     	
     
                	 }
                	     for (int index = 0; index < list.size(); index++)
                	     {            	    	
                	    	 Collections.sort(list, Collections.reverseOrder()); 	
          	    		   System.out.println(list.get(index));
                	     }         	     	            	     
                	 }catch(Exception e){
                	     e.printStackTrace();
                	 }          	 
                }
            }
     
     
    /* ici je lance l ecriture du pseudo et du score dans le fichier */ 
     
    String pseudoT = (nom);			
     int scoreT = (h);
     Lireetecrire lee = new Lireetecrire();
     
     				lee.ecrire(scoreT+";");
     				lee.ecrire(pseudoT+";");
     				lee.ecrire("\n");
    mon fichier texte ressemble a ca :
    600;asze;
    900;kijfrgg;
    1700;koerf;

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Bonjour,

    tu lis ton fichier ligne par ligne, et tu essais de trier ta table selon ces lignes qui commencent par le pseudo. Donc tu trie les lignes par le pseudo.

    Tu as ajouté un séparateur dans ton fichier, utilise le pour séparé dans ta liste le pseudo du score.

  3. #3
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    tu peux aussi créer une classe qui stockerait le pseudo et le score.

    Au lieu de remplir ta liste avec des strings tu la remplis avec des instances de cette classe.

    et ta classe tu la fait implémenter l'interface Comparable qui te permettra de définir de quelle manière sera triée ta liste ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Par défaut
    Merci pour vos reponse mais etant debutant en java si vous pouviez me donner des exemples ca m aiderai un peu plus car ca reste un peu trop abstrait desole :s

    J ai ajouter ceci à mon projet mais je ne sais pas si c est ca que je dois faire

    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
     
     
      FileReader lecteurDeFichier = new FileReader(name);
                		              BufferedReader buff = new BufferedReader(lecteurDeFichier);
                		              String premLigne = buff.readLine();
                		              StringTokenizer st = new StringTokenizer(premLigne, ";" );            		             
     
                		              Scanner s = new Scanner(new FileReader(new File(name)));
     
                		                while(s.hasNext() && st.hasMoreTokens()){
                		            	                  list.add(st.nextToken()+" ");
     
                		            	               }
     
                	     for (int index = 0; index < list.size(); index++)
                	     {
                	    	 Collections.sort(list);
     
                	    	// Collections.sort(list, Collections.reverseOrder()); 
          	    		   System.out.println(list.get(index));
                	     }
    fichier texte : 600;kerker;589;fefefef;475895;efesaaaa;

    Avec ce code j obtiens :

    475895
    589
    600
    efesaaaa
    fefefef
    kerker

    C est bon ?

    J ai juste changer le mode d ecriture de mon fichier au lieu d ecrire le score ; le pseudo ; \n , j ecris le score ; le pseudo ; etc etc ...

    Si je veux garder le \n je dois changer quoi pour lire toutes les lignes svp ?

  5. #5
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    bon, je ne sais pas si c'est vraiment ce que tu veux faire. Mais ce que je te proposais ressemble un peu à ça. A toi de remplir les trous ...

    D'abord on crée une classe pour représenter le couple pseudo/score. comme je ne suis pas inspiré je l'appelle Ligne

    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
    class Ligne {
     
       private String pseudo;
       private int score;
     
       public Ligne(String pseudo, int score) {
          this.pseudo = pseudo;
          this.score = score;
       }
     
     
       // pour pouvoir construire un objet à partir d'une ligne lue du fichier
       // attention, il faut sûrement rajouter d'autres contrôles, style la chaine contient bien le caractère séparateur
       public Ligne(String readLine, String sep) {
            String[] data = readLine.split(sep);
            this.pseudo = data[0];
            this.score = data[1];
       }
     
       // les getters
       // et éventuellement les setters
     
    }

    ensuite je regarde la FAQ pour savoir comment lire un fichier ligne par ligne
    -> Comment lire un fichier ligne par ligne ?

    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
     
    List<Ligne> liste = new ArrayList<Ligne>();
    String filePath = "g:\\fichier.txt";
    Scanner scanner=new Scanner(new File(filePath));
     
    try {
       // On boucle sur chaque champ detecté
       while (scanner.hasNextLine()) {
           String line = scanner.nextLine();
     
          liste.add(new Ligne(line));
     
       }
    } finally {
       scanner.close();
    }

    enfin, pour gérer le tri selon le score, il faut que Ligne implémente l'interface Comparable. Petit tour à la FAQ -> Comment trier une List (ArrayList, Vector, ...) ou un tableau?

    Ce qui donne pour la classe Ligne :

    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
    class Ligne implements Comparable<Ligne>{
     
      // ...
     
     
       public int CompareTo(Object o2) {
          if(! (o2 instanceof Ligne)) {
             throw new ClassCastException("Cannot compare Ligne with "+o2.getClass().getName());
          }
          return this.compareTo((Ligne)o2);
       }
     
     
      //  je te laisse le soin d'implémenter la méthode qui compare les éléments par leur valeur de "score"
      public int compareTo(Ligne arg0) {
    		// TODO Auto-generated method stub
    		return 0;
      }
     
    }
    Et là maintenant, tu peux trier la liste simplement en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(liste);
    La méthode sort va utiliser ta méthode CompareTo pour trier la liste.

    tu peux aussi utiliser une liste triée pour que le tri se fasse directement lors du add()

    bon courage

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Par défaut
    Merci pour ta reponse detaille

    J ai donc essaye toute la journée de faire tourner cette methode sans trop de succes malheureusement :/

    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
     
     
    	public void Lire () throws FileNotFoundException 
    			{
    				List<Ligne> liste = new ArrayList<Ligne>();
    				String filePath = System.getProperty("user.dir") + "\\monfichier.txt";
     
    				Scanner scanner=new Scanner(new File(filePath));
     
    				try {
    				   // On boucle sur chaque champ detecté
    				   while (scanner.hasNextLine()) {
    				       String line = scanner.nextLine();
    				      liste.add(new Ligne(line));
    				   }
    				   Collections.sort(liste);
    				   for (int index = 0; index < liste.size(); index++)
              	     {
        	    		   System.out.println(liste.get(index));
              	     }
     
    				} finally {
    				   scanner.close();
    				}
    			}
            }
     
            class Ligne implements Comparable<Ligne>{
     
            	   private String pseudo;
            	   private int scores;
     
            	   public Ligne(String pseudo, int scores) {
            		      this.pseudo = pseudo;
            		      this.scores = scores;
            		   }
     
            	   // pour pouvoir construire un objet à partir d'une ligne lue du fichier
            	   // attention, il faut sûrement rajouter d'autres contrôles, style la chaine contient bien le caractère séparateur
            	   public Ligne(String readLine, String sep) {
            	        String[] data = readLine.split(";");
     
            	        this.pseudo = data[0];
            	        this.scores = data[1];
            	   }
     
            	   // les getters
            	   // et éventuellement les setters
     
    			public void setPseudo(String pseudo) {
    				this.pseudo = pseudo;
    			}
     
    			public String getPseudo() {
    				return pseudo;
    			}
     
    			public void setScores(int scores) {
    				this.scores = scores;
    			}
     
    			public int getScores() {
    				return scores;
    			}      	 
     
    			 public int CompareTo(Object o2) {
       		      if(! (o2 instanceof Ligne)) {
       		         throw new ClassCastException("Cannot compare Ligne with "+o2.getClass().getName());
       		      }
       		      return this.compareTo((Ligne)o2);
       		   }
     
    			@Override
    			public int compareTo(Ligne other) {
    				  int nombre1 = ((Ligne) other).getScores(); 
    			      int nombre2 = this.getScores();
     
    			      if (nombre1 > nombre2)  return -1; 
    			      else if(nombre1 == nombre2) return 0; 
    			      else return 1; 
    			}
     
            }
    J ai un soucis au niveau du : liste.add(new Ligne(line));
    Il me souligne line en me disant qu il ne trouve pas le sontructeur correspondant ce qui est logique vu que Ligne est compose de Pseudo et Scores . line devrait etre compose de Pseudo et Scores si j ai tout compris mais bon :/

    Enfin j ai un soucis avec this.scores = data[1]; , le debuger me dis qu il ne peut pas transformer un int en string , OK mais je fais quoi ? J ai mis mon Score en String et pour la comparaison , je recast en integer mais ca n a rien changer :s

    En triffouillant un peu j ai reussi à le faire tourner mais ca me sortait

    Fenetre$Ligne@1bac748
    Fenetre$Ligne@17172ea
    Fenetre$Ligne@12f6684
    Fenetre$Ligne@f38798

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 19/12/2010, 10h40
  2. Lecture d'un fichier texte et affichage dans flash
    Par TaleMaker dans le forum Flash
    Réponses: 2
    Dernier message: 29/04/2010, 12h18
  3. Lecture Fichier text et affichage textbox
    Par miss_monika dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 13/05/2007, 10h34
  4. [VB]Probleme lecture fichier text et affichage
    Par clochardevobsy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 08h46
  5. affichage du contenu d'un fichier texte
    Par axel-erator dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/08/2005, 16h06

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