Remplir Map a partir de fichier texte

omidaoui Messages postés 39 Statut Membre -  
omidaoui Messages postés 39 Statut Membre -
Bonjour,

j'ai un problem lors du chargement de donnees dans mon Map<String, Map<String,Double>>,
je ve remplire cet map a partire d'un fichier texte de cet forme

T-Rqt1 T-Rqt2 T-Rqt3 T-Rqt4
T-Doc1 1.5 11.0 10.0 14.0
T-Doc2 29.0 29.0 29.0 40.0
T-Doc3 23.0 10.0 1.0 1.0
T-Doc4 29.0 2.0 2.0 2.0
T-Doc5 20.0 9.0 1.0 1.5
T-Doc6 14.0 5.0 20.0 0.0

pour quelle soit de la forme :

MapDoc =
{T-Doc1={T-Rqt1=1.5, T-Rqt2=11.0, T-Rqt3=10.0, T-Rqt4=14.0},
T-Doc2={T-Rqt1=29.0, T-Rqt2=29.0, T-Rqt3=29.0, T-Rqt4=40.0},
T-Doc3={T-Rqt1=23.0, T-Rqt2=10.0, T-Rqt3=1.0, T-Rqt4=1.0},
T-Doc4={T-Rqt1=14.0, T-Rqt2=5.0, T-Rqt3=20.0, T-Rqt4=0.0},
T-Doc5 ={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0}
}

moi puisque je charge au debut un fichier requets contenant les termes du requet T-Rqt1,2,3,4
chargés dans une listRqt

donc j ai fait le code suivant

public void chargermotsfichier(String chemin) throws IOException {

File f = new File(chemin);
Scanner s = new Scanner(f);
String term = "";
Map<String, Double> Mapfichier = new HashMap<String, Double>();

// je saute la premiere ligne qui contient les termes du requete qu j'ai deja dans
// listRqt qui est une ArrayList

s.nextLine();

while(s.hasNextLine()){

StringTokenizer scc=new StringTokenizer(s.nextLine(),"\t");

while(scc.hasMoreTokens()) {

term = scc.nextToken();
// le variable term va contenir chaque fois les T-Doc1,2,3,4,5,6..

for(int i = 0; i < listRqt.size(); i++){

String Oi = scc.nextToken();
Double Wi = Double.parseDouble(Oi);
// les Wi vont contenir les valeur double de la matrice

// cet map fichier va contenir les termes du requet T-Rqt et les valeurs
// de chaue lignes correnspondant a un T-Doc donnee

Mapfichier.put(listRqt.get(i), Wi);

}

// apres je charge le tt dans le map globale

MapDoc.put(term, Mapfichier);

]
}

System.out.println("MapDoc = "+MapDoc);
}

le problem que j'ai, c'est que a la fin je trouve mon MapDoc

comme ca

MapDoc =
{T-Doc1={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0},
T-Doc2={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0},
T-Doc3={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0},
T-Doc4={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0},
T-Doc5 ={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0},
T-Doc6 ={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0}
}

c'est que les donnee du Mapfichier vont etre ecrase chaque fois, et aussi dans le MapDoc
les valeur (Mapfichier) vont etre ecraser par la dernier Mapfichier construite

est ce k'il y a une solution
aider moi SVP

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Désolé de ne pas chercher vraiment à corriger ton code (je ne connais pas les StringTokenizer) mais voici une manière de faire :

    public static Map<String,Map<String,Double>> charger(File file) throws FileNotFoundException
    {
        Scanner sc = new Scanner(file);
        
        String[] entete = sc.nextLine().split("\t");
        
        Map<String,Map<String,Double>> globalMap = new TreeMap<String,Map<String,Double>>();
        
        while (sc.hasNextLine())
        {
            String[] data = sc.nextLine().split("\t");
            Map<String,Double> partialMap = new TreeMap<String,Double>();
            
            for (int i=0; i<entete.length && i+1<data.length; i++)
                partialMap.put(entete[i], Double.parseDouble(data[i+1]));
            
            globalMap.put(data[0], partialMap);
        }
        
        sc.close();
        
        return globalMap;
    }
    
    public static void main (String[] args) throws IOException
    {
        System.out.println(charger(new File("C:\\rqt.txt")));
    }

    Ce qui donne ceci :

    {
    T-Doc1={T-Rqt1=1.5, T-Rqt2=11.0, T-Rqt3=10.0, T-Rqt4=14.0},
    T-Doc2={T-Rqt1=29.0, T-Rqt2=29.0, T-Rqt3=29.0, T-Rqt4=40.0},
    T-Doc3={T-Rqt1=23.0, T-Rqt2=10.0, T-Rqt3=1.0, T-Rqt4=1.0},
    T-Doc4={T-Rqt1=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt4=2.0},
    T-Doc5={T-Rqt1=20.0, T-Rqt2=9.0, T-Rqt3=1.0, T-Rqt4=1.5},
    T-Doc6={T-Rqt1=14.0, T-Rqt2=5.0, T-Rqt3=20.0, T-Rqt4=0.0}
    }
    0
  2. omidaoui Messages postés 39 Statut Membre
     
    je vous remercie pour votre reponse, j'ai essayer ton code, mais le resultat c 'est qu il m affiche le Map doc comme ca

    {
    T-Doc1={=1.5, T-Rqt2=11.0, T-Rqt3=10.0, T-Rqt1=14.0},
    T-Doc2={=29.0, T-Rqt2=29.0, T-Rqt3=29.0, T-Rqt1=40.0},
    T-Doc3={=23.0, T-Rqt2=10.0, T-Rqt3=1.0, T-Rqt1=1.0},
    T-Doc4={=29.0, T-Rqt2=2.0, T-Rqt3=2.0, T-Rqt1=2.0},
    T-Doc5={=20.0, T-Rqt2=9.0, T-Rqt3=1.0, T-Rqt1=1.5},
    T-Doc6={=14.0, T-Rqt2=5.0, T-Rqt3=20.0, T-Rqt1=0.0}
    }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Je pense que cela vient d'un mal entendu sur le contenu du fichier parce que chez moi ça marche bien lorsque je le testes avec ce fichier :

      T-Rqt1	T-Rqt2	T-Rqt3	T-Rqt4
      T-Doc1	1.5	11.0	10.0	14.0
      T-Doc2	29.0	29.0	29.0	40.0
      T-Doc3	23.0	10.0	1.0	1.0
      T-Doc4	29.0	2.0	2.0	2.0
      T-Doc5	20.0	9.0	1.0	1.5
      T-Doc6	14.0	5.0	20.0	0.0
      
      0
    2. omidaoui Messages postés 39 Statut Membre
       
      oui, c vrai c bn parceque mon fichier il ya une tabulation au debut

      \t T-Rqt1 T-Rqt2 T-Rqt3 T-Rqt4
      T-Doc1 1.5 11.0 10.0 14.0
      T-Doc2 29.0 29.0 29.0 40.0
      T-Doc3 23.0 10.0 1.0 1.0
      T-Doc4 29.0 2.0 2.0 2.0
      T-Doc5 20.0 9.0 1.0 1.5
      T-Doc6 14.0 5.0 20.0 0.0
      0
    3. omidaoui Messages postés 39 Statut Membre
       
      merci bcp
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      Il suffit alors de modifier un peu les indices au moment de la boucle, et ça devrait aller :

      for (int i=1; i<entete.length && i<data.length; i++)
      	partialMap.put(entete[i], Double.parseDouble(data[i]));
      0
    5. omidaoui Messages postés 39 Statut Membre
       
      we c ce ke jai fait, ^_^ merci
      0