Remplir Map a partir de fichier texte

Fermé
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017 - 11 nov. 2012 à 16:15
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017 - 11 nov. 2012 à 17:41
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
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 nov. 2012 à 16:41
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
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
11 nov. 2012 à 17:06
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
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 nov. 2012 à 17:10
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
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
11 nov. 2012 à 17:21
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
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
11 nov. 2012 à 17:22
merci bcp
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 nov. 2012 à 17:27
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
omidaoui Messages postés 32 Date d'inscription dimanche 11 novembre 2012 Statut Membre Dernière intervention 2 décembre 2017
11 nov. 2012 à 17:41
we c ce ke jai fait, ^_^ merci
0