Afficher les données dans un tableau

Fermé
Utilisateur anonyme - 28 juin 2011 à 02:29
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 28 juin 2011 à 05:24
Bonjour,
SVP vous pouvez m'aider je me lance dans un programme en java sensé prendre une valeur d'un fichier texte saisi par un utilisateur afin de chercher les lignes qui contiennent cette valeur pour les classer dans un tableau en cliquant sur un bouton. Voilà une petite partie de mon fichier puisqu'il contient plusieurs lignes :
M086A 562A M04A 1059 00058 0000147 51158
M086M 562A M04A 1030 00259 0000014 51149
M086A 567D M04A 1015 00042 0000045 51415
M088D 562A M04A 1005 00128 0000147 51146
Par exemple si l'utilisateur a saisi M086A il doit chercher la ligne qui contient cette valeur afin de m'afficher dans un tableau de 5 colonnes 5 champs précis de la ligne qui a cette valeur :
M086A 562A 00058 0000147 51158
M086A 567D 00042 0000045 51415

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 juin 2011 à 03:31
Quand tu charges ton fichier en mémoire tu devrais utiliser une collection pour classer efficacement tes données. La consultation serait alors triviale.

Je pense en particulier à une HashMap<String,LinkedList<String>>
Le premier String correspondrait à tes mots clés (M086A par exemple), et la liste aux différentes valeurs qui satisfont à cette clé (les lignes de ton fichier)

Une amélioration évidente pourrait être de remplacer le String en paramètre de la liste par un String[], c'est à dire qu'au lieu de mémoriser toute la ligne, tu la scinderai en colonne dès le chargement du fichier.
Remarque : dans ce cas, tout en scindant les informations, on pourrait remplacer le tableau par une ArrayList<String> ce qui nous donnerait une collection :

HashMap<String,LinkedList<ArrayList<String>>>

Ça commence à devenir très imbriqué, mais ton problème s'y prête bien, et utiliser ces collections rendra ton programme extrêmement performant, et facile à coder vu les méthodes déjà accessibles pour ces classes...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 juin 2011 à 04:34
Exemple d'implémentation :

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;

class Classeur
{
   private HashMap<String,LinkedList<ArrayList<String>>> coll;
   
   public Classeur(String nomFichier) throws FileNotFoundException
   {
      coll = new HashMap<String,LinkedList<ArrayList<String>>>();
      
      Scanner texte = new Scanner(new File(nomFichier));
 
      while (texte.hasNextLine())
      {
         ArrayList<String> colonnes = new ArrayList<String>();

         Scanner ligne = new Scanner(texte.nextLine()).useDelimiter(" ");

         while (ligne.hasNext())
            colonnes.add(ligne.next());

         ligne.close();  
       
         if (colonnes.size()>0)
         {
            String key=colonnes.get(0);
            
            if (!coll.containsKey(key))
               coll.put(key,new LinkedList<ArrayList<String>>());

            coll.get(key).add(colonnes);
         }
      }

      texte.close();
   }
   
   public String[][] get(String key)
   {
      LinkedList<ArrayList<String>> data = coll.get(key);

      if (data==null)
         return null;

      String[] tab[] = new String[data.size()][];

      int i=0;
      for (ArrayList<String> a : data)
      {
         tab[i]=new String[a.size()];

         int j=0;
         for (String s : a)
         {
            tab[i][j]=s;
            j++;
         }

         i++;
      }

      return tab;
   }
}

public class Test
{   
   public static void afficher(String[][] tab)
   {
      for (int i=0; i<tab.length; i++)
      {
         try
         {
            System.out.print(tab[i][0]+" ");
            System.out.print(tab[i][1]+" ");
            System.out.print(tab[i][4]+" ");
            System.out.print(tab[i][5]+" ");
            System.out.println(tab[i][6]);
         }
         catch (ArrayIndexOutOfBoundsException e)
         {
            System.out.println("?");
         }
      }
   }
   
   public static void main(String args[]) throws FileNotFoundException
   {
      Classeur c = new Classeur("D:\\test.txt");      
      afficher(c.get("M086A"));
   }   
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 juin 2011 à 05:24
Remarque : il serait plus logique (et plus efficace) de filtrer les colonnes que l'on veut à l'appel du get, ce qui permettrait de faire le traitement sur les listes plutôt que les tableaux, meilleur en performance.
Surtout ça nous éviterait de récupérer un tableau plus grand que ce qu'on en veut puisque certaines colonnes ne nous intéresse pas, et ainsi le traiter plus facilement à l'affichage.

public String[][] get(String key,int...index)
{
   LinkedList<ArrayList<String>> data = coll.get(key);
   
   if (data==null)
      return null;
   
   String tab[][] = new String[data.size()][index.length];
   
   int i=0;
   for (ArrayList<String> a : data)
   {
      int n=a.size();
      
      int j=0;
      for (int k : index)
      {
         tab[i][j] = (k>=0 && k<n) ? a.get(k) : "?";
         j++;
      }
      
      i++;
   }

   return tab;
}

public static void afficher(String[][] tab)
{
   for (int i=0; i<tab.length; i++)
   {
      for (int j=0; j<tab[i].length; j++)
         System.out.print(tab[i][j]+" ");

      System.out.println();
   }
}

public static void main(String args[]) throws FileNotFoundException
{
   Classeur c = new Classeur("D:\\test.txt");      
   afficher(c.get("M086A",0,1,4,5,6));
}
0