Somme de Maps
omidaoui
Messages postés
32
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonsoir,
jai des fichier text de la forme
par exemple Doc 1 :
\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
Doc 2 :
\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
Doc 3 :
\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
et jai une liste ki contient tout les termes T-Doc possible
T-Doc1,T-Doc2,T-Doc3,T-Doc4,T-Doc5,T-Doc6,T-Doc7,T-Doc8,T-Doc9,T-Doc10,T-Doc11
je charge un document dans une Map<String,Map<String,Double>>
comme par exemple pour le Doc1 est charge dans le MApDoc suivant :
le MapDoc1 =
{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}
}
alors
mon but a atteindre
c est d avoir une map resultante ki va contenir la somme des valeur pour chaque terme trouvé
moi jai construit au debut une matriceInit avec des valeur nulle a partire de la liste exhaustif
\t T-Rqt1 T-Rqt2 T-Rqt3 T-Rqt4
T-Doc1 0.0 0.0 0.0 0.0
T-Doc2 0.0 0.0 0.0 0.0
T-Doc3 0.0 0.0 0.0 0.0
T-Doc4 0.0 0.0 0.0 0.0
T-Doc5 0.0 0.0 0.0 0.0
T-Doc6 0.0 0.0 0.0 0.0
T-Doc7 0.0 0.0 0.0 0.0
T-Doc8 0.0 0.0 0.0 0.0
T-Doc9 0.0 0.0 0.0 0.0
T-Doc10 0.0 0.0 0.0 0.0
T-Doc11 0.0 0.0 0.0 0.0
et apres j ai essayer additionner en parcourant les T-Doc, et le chercher dans MapDoc1
pour prendre le Map correspondant
par exemple
pour term T-Doc1 ={T-Rqt1=1.5, T-Rqt2=11.0, T-Rqt3=10.0, T-Rqt4=14.0}
et je le cherche ensuite dans la matriceInit
T-Doc1 ={T-Rqt1=0.0, T-Rqt2=0.0, T-Rqt3=0.0, T-Rqt4=0.0}
apres je parcours les deux map et je cherche chaque deux Key ki se ressemple et je somme leurs valeur pour les charger en suis dans MapResultat
a ki jai affecter au debut
la matrice matriceInit
et ainsi de suite,
bon si quelqu'un peut m'aider, je veux a chaque fois kon charge un doc kil soit additionner avec le precedent dans la matrice global definit par la liste
T-Doc1,T-Doc2,T-Doc3,T-Doc4,T-Doc5,T-Doc6,T-Doc7,T-Doc8,T-Doc9,T-Doc10,T-Doc11
comme suit
\t T-Rqt1 T-Rqt2 T-Rqt3 T-Rqt4
T-Doc1 (0.0+1.5+1.5+1.5) ( 0.0+11.0+11.0+11.0) (0.0+...) (0.0+...)
T-Doc2 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc3 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc4 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc5 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc6 (0.0+14.0+...) (0.0+5.0+5.0+5.0) (0.0+...) (0.0+...)
T-Doc7 0.0 0.0 0.0 0.0
T-Doc8 0.0 0.0 0.0 0.0
T-Doc9 0.0 0.0 0.0 0.0
T-Doc10 0.0 0.0 0.0 0.0
T-Doc11 0.0 0.0 0.0 0.0
voici mon code
je charge les fichier
public static Map<String,Map<String,Double>> charger(String chemin) throws FileNotFoundException
{
File f = new File(chemin);
Scanner sc = new Scanner(f);
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+1], Double.parseDouble(data[i+1]));
globalMap.put(data[0], partialMap);
}
sc.close();
return globalMap;
}
dans
MapDoc = charger("doc1.txt");
et j ai deja une MapInit initiale
Map<String, Map<String,Double>> MapInit = new HashMap<String, Map<String,Double>>();
ki contient
le squelete finale rempli par des zero apartire de la listNi ki contier la listes globale des termes et la liste listRqt ki contier les termes du requetes T-Rqt...
apres jai fait une methode ki rempli le Mapresultat
public void RemplireMatriceResultat(ArrayList<String> LDoc,ArrayList<String> LQuery, JTextArea a ){
Double b = 0.0;
MapResultat = MapInit;
Double[][] matrice = new Double[listNi.size()][LQuery.size()];
for(int k = 0; k < listNi.size(); k++){
termeDoc = listNi.get(k);
for(int j = 0; j < LQuery.size(); j++){
termeQuery = LQuery.get(j);
Maptemp2 = MapInit.get(termeDoc);
Double c = Maptemp2.get(termeQuery);
if(MapDoc.containsKey(termeDoc)){
Maptemp3 = MapDoc.get(termeDoc);
b = Maptemp3.get(termeQuery);
System.out.println("b = "+b);
}
else if(!MapDoc.containsKey(termeDoc)){
for(int i = 0; i < LQuery.size(); i++){
String t = LQuery.get(j);
Maptemp3.put(t, 0.0);
}
Maptemp3 = MapDoc.get(termeDoc);
b = Maptemp3.get(termeQuery);
}
matrice[k][j]= c + b ;
Maptemp.put(termeQuery, matrice[k][j]);
}
MapResultat.put(termeDoc, Maptemp);
System.out.println("MapResultat = "+MapResultat);
}
}
jai un probleme kon le code arrive au T-Doc de la matriceInit ki nes pas dans le MapDoc1
par exepmle le T-Doc7
le c = 0.0
mais le Maptemp3 = null;
et il se bloque
et en plus de ca tout les ligne changés sont identique a la fin, et ecraser par le deernier resultat trouvee
Aider moi svp
si kelkun a une solution plus simple, je serai tres reconnaissant merci
jai des fichier text de la forme
par exemple Doc 1 :
\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
Doc 2 :
\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
Doc 3 :
\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
et jai une liste ki contient tout les termes T-Doc possible
T-Doc1,T-Doc2,T-Doc3,T-Doc4,T-Doc5,T-Doc6,T-Doc7,T-Doc8,T-Doc9,T-Doc10,T-Doc11
je charge un document dans une Map<String,Map<String,Double>>
comme par exemple pour le Doc1 est charge dans le MApDoc suivant :
le MapDoc1 =
{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}
}
alors
mon but a atteindre
c est d avoir une map resultante ki va contenir la somme des valeur pour chaque terme trouvé
moi jai construit au debut une matriceInit avec des valeur nulle a partire de la liste exhaustif
\t T-Rqt1 T-Rqt2 T-Rqt3 T-Rqt4
T-Doc1 0.0 0.0 0.0 0.0
T-Doc2 0.0 0.0 0.0 0.0
T-Doc3 0.0 0.0 0.0 0.0
T-Doc4 0.0 0.0 0.0 0.0
T-Doc5 0.0 0.0 0.0 0.0
T-Doc6 0.0 0.0 0.0 0.0
T-Doc7 0.0 0.0 0.0 0.0
T-Doc8 0.0 0.0 0.0 0.0
T-Doc9 0.0 0.0 0.0 0.0
T-Doc10 0.0 0.0 0.0 0.0
T-Doc11 0.0 0.0 0.0 0.0
et apres j ai essayer additionner en parcourant les T-Doc, et le chercher dans MapDoc1
pour prendre le Map correspondant
par exemple
pour term T-Doc1 ={T-Rqt1=1.5, T-Rqt2=11.0, T-Rqt3=10.0, T-Rqt4=14.0}
et je le cherche ensuite dans la matriceInit
T-Doc1 ={T-Rqt1=0.0, T-Rqt2=0.0, T-Rqt3=0.0, T-Rqt4=0.0}
apres je parcours les deux map et je cherche chaque deux Key ki se ressemple et je somme leurs valeur pour les charger en suis dans MapResultat
a ki jai affecter au debut
la matrice matriceInit
et ainsi de suite,
bon si quelqu'un peut m'aider, je veux a chaque fois kon charge un doc kil soit additionner avec le precedent dans la matrice global definit par la liste
T-Doc1,T-Doc2,T-Doc3,T-Doc4,T-Doc5,T-Doc6,T-Doc7,T-Doc8,T-Doc9,T-Doc10,T-Doc11
comme suit
\t T-Rqt1 T-Rqt2 T-Rqt3 T-Rqt4
T-Doc1 (0.0+1.5+1.5+1.5) ( 0.0+11.0+11.0+11.0) (0.0+...) (0.0+...)
T-Doc2 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc3 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc4 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc5 (0.0+...) (0.0+...) (0.0+...) (0.0+...)
T-Doc6 (0.0+14.0+...) (0.0+5.0+5.0+5.0) (0.0+...) (0.0+...)
T-Doc7 0.0 0.0 0.0 0.0
T-Doc8 0.0 0.0 0.0 0.0
T-Doc9 0.0 0.0 0.0 0.0
T-Doc10 0.0 0.0 0.0 0.0
T-Doc11 0.0 0.0 0.0 0.0
voici mon code
je charge les fichier
public static Map<String,Map<String,Double>> charger(String chemin) throws FileNotFoundException
{
File f = new File(chemin);
Scanner sc = new Scanner(f);
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+1], Double.parseDouble(data[i+1]));
globalMap.put(data[0], partialMap);
}
sc.close();
return globalMap;
}
dans
MapDoc = charger("doc1.txt");
et j ai deja une MapInit initiale
Map<String, Map<String,Double>> MapInit = new HashMap<String, Map<String,Double>>();
ki contient
le squelete finale rempli par des zero apartire de la listNi ki contier la listes globale des termes et la liste listRqt ki contier les termes du requetes T-Rqt...
apres jai fait une methode ki rempli le Mapresultat
public void RemplireMatriceResultat(ArrayList<String> LDoc,ArrayList<String> LQuery, JTextArea a ){
Double b = 0.0;
MapResultat = MapInit;
Double[][] matrice = new Double[listNi.size()][LQuery.size()];
for(int k = 0; k < listNi.size(); k++){
termeDoc = listNi.get(k);
for(int j = 0; j < LQuery.size(); j++){
termeQuery = LQuery.get(j);
Maptemp2 = MapInit.get(termeDoc);
Double c = Maptemp2.get(termeQuery);
if(MapDoc.containsKey(termeDoc)){
Maptemp3 = MapDoc.get(termeDoc);
b = Maptemp3.get(termeQuery);
System.out.println("b = "+b);
}
else if(!MapDoc.containsKey(termeDoc)){
for(int i = 0; i < LQuery.size(); i++){
String t = LQuery.get(j);
Maptemp3.put(t, 0.0);
}
Maptemp3 = MapDoc.get(termeDoc);
b = Maptemp3.get(termeQuery);
}
matrice[k][j]= c + b ;
Maptemp.put(termeQuery, matrice[k][j]);
}
MapResultat.put(termeDoc, Maptemp);
System.out.println("MapResultat = "+MapResultat);
}
}
jai un probleme kon le code arrive au T-Doc de la matriceInit ki nes pas dans le MapDoc1
par exepmle le T-Doc7
le c = 0.0
mais le Maptemp3 = null;
et il se bloque
et en plus de ca tout les ligne changés sont identique a la fin, et ecraser par le deernier resultat trouvee
Aider moi svp
si kelkun a une solution plus simple, je serai tres reconnaissant merci
A voir également:
- Somme de Maps
- Google maps satellite - Guide
- Google maps - Guide
- Si vous utilisez Google Maps, vous allez devoir faire un choix très important - Guide
- Maps - Accueil - Transports & Cartes
- Formule somme excel colonne - Guide
4 réponses
Dès que je commencé à t'aider sur ton autre sujet, il y a un truc qui me posait problème c'est ton Map<String,Map<String,Double>>
Je crois qu'il serait plus simple d'avoir une seule Map, et où chaque Double serait affectée par une double clé (que j'appelle "Paire" dans le code qui suit).
Cela rend les manipulations plus simples.
Ce qui donne (avec tes 3 fichiers Doc1, Doc2 et Doc3) :
Je crois qu'il serait plus simple d'avoir une seule Map, et où chaque Double serait affectée par une double clé (que j'appelle "Paire" dans le code qui suit).
Cela rend les manipulations plus simples.
import java.io.File; import java.io.FileNotFoundException; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; class Paire implements Comparable<Paire> { public final String doc; public final String rqt; public Paire(String doc, String rqt) { this.doc = doc; this.rqt = rqt; } public int compareTo(Paire p) { if (doc.equals(p.doc)) return rqt.compareTo(p.rqt); else return doc.compareTo(p.doc); } public String toString() { return String.format("(%s,%s)",doc,rqt); } } class Data extends TreeMap<Paire,Double> { private static final long serialVersionUID = 1; public Double put(String doc, String rqt,Double d) { return put(new Paire(doc,rqt),d); } public Double get(String doc, String rqt) { return get(new Paire(doc, rqt)); } public void ajouter(Data toAdd) { for (Map.Entry<Paire, Double> e : toAdd.entrySet()) { if (this.containsKey(e.getKey())) this.put(e.getKey(), this.get(e.getKey())+e.getValue()); else this.put(e.getKey(), e.getValue()); } } } public class Traitement { public static Data charger(String chemin) throws FileNotFoundException { Scanner sc = new Scanner(new File(chemin)); String[] rqt = sc.nextLine().split("\t"); Data data = new Data(); while (sc.hasNextLine()) { String[] doc = sc.nextLine().split("\t"); for (int i=1; i<rqt.length && i<doc.length; i++) data.put(doc[0], rqt[i], Double.parseDouble(doc[i])); } sc.close(); return data; } public static Data somme(String...chemins) throws FileNotFoundException { Data data = new Data(); for (String chemin : chemins) data.ajouter(charger(chemin)); return data; } public static void main(String...args) throws FileNotFoundException { System.out.println(somme("C:/Doc1.txt","C:/Doc2.txt","C:/Doc3.txt")); } }
Ce qui donne (avec tes 3 fichiers Doc1, Doc2 et Doc3) :
{ (T-Doc1,T-Rqt1)= 4.5, (T-Doc1,T-Rqt2)=33.0, (T-Doc1,T-Rqt3)=30.0, (T-Doc1,T-Rqt4)= 42.0, (T-Doc2,T-Rqt1)=87.0, (T-Doc2,T-Rqt2)=87.0, (T-Doc2,T-Rqt3)=87.0, (T-Doc2,T-Rqt4)=120.0, (T-Doc3,T-Rqt1)=69.0, (T-Doc3,T-Rqt2)=30.0, (T-Doc3,T-Rqt3)= 3.0, (T-Doc3,T-Rqt4)= 3.0, (T-Doc4,T-Rqt1)=87.0, (T-Doc4,T-Rqt2)= 6.0, (T-Doc4,T-Rqt3)= 6.0, (T-Doc4,T-Rqt4)= 6.0, (T-Doc5,T-Rqt1)=40.0, (T-Doc5,T-Rqt2)=18.0, (T-Doc5,T-Rqt3)= 2.0, (T-Doc5,T-Rqt4)= 3.0, (T-Doc6,T-Rqt1)=14.0, (T-Doc6,T-Rqt2)= 5.0, (T-Doc6,T-Rqt3)=20.0, (T-Doc6,T-Rqt4)= 0.0 }
oui, je suis dacord avec toi, mais j'ai fait ça parceque je doit avoir en resultat un fichier text de la meme forme ke les document c a d une matrice
bon je te remercie beaucoup , pr ton aide je vais essayer d'utiliser ton code et l'adapter pour avoir le resultat dont j'en ai besoin
Merci encore
Merci encore
bonsoir,
je voulais utiliser ton code, pour convertir le resultat en une matrice comme celle des docs et je me suis coincee
si tu pe m'aider stp merci
je voulais utiliser ton code, pour convertir le resultat en une matrice comme celle des docs et je me suis coincee
si tu pe m'aider stp merci
Comme ceci par exemple (à mettre dans ma classe Data)
Remarque : j'ai fait des println pour montrer quel ordre est utilisé en lignes et en colonnes, mais ça devrait toujours être l'ordre alphabétique.
public double[][] toMatrix() { TreeSet<String> docSet = new TreeSet<String>(); TreeSet<String> rqtSet = new TreeSet<String>(); for (Paire p : keySet()) { docSet.add(p.doc); rqtSet.add(p.rqt); } System.out.println("Rqt : "+rqtSet); System.out.println("Doc : "+docSet); int i = 0; int nDoc = docSet.size(); int nRqt = rqtSet.size(); double[][] matrix = new double[nDoc][nRqt]; for (double d : values()) matrix[i / nRqt][i++ % nRqt] = d; return matrix; }
Remarque : j'ai fait des println pour montrer quel ordre est utilisé en lignes et en colonnes, mais ça devrait toujours être l'ordre alphabétique.
public static void main(String...args) throws FileNotFoundException { Data data = somme("C:/Doc1.txt","C:/Doc2.txt","C:/Doc3.txt"); // affichage de la map System.out.println(data); double[][] matrix = data.toMatrix(); // affichage de la matrice for (int i=0; i<matrix.length; i++) { for (int j=0; j<matrix[i].length; j++) System.out.print(matrix[i][j]+"\t"); System.out.println(); } }
On peut facilement reprendre la méthode toMatrix pour rajouter tes en-têtes.
Là j'ai fait une méthode toString2 pour conserver la méthode toString telle qu'elle existe dans TreeMap, pour que ce soit plus simple à déboguer, mais à terme on pourrait très bien utiliser cette méthode comme toString de la classe.
Là j'ai fait une méthode toString2 pour conserver la méthode toString telle qu'elle existe dans TreeMap, pour que ce soit plus simple à déboguer, mais à terme on pourrait très bien utiliser cette méthode comme toString de la classe.
public String toString2() { TreeSet<String> docSet = new TreeSet<String>(); TreeSet<String> rqtSet = new TreeSet<String>(); StringBuilder sb = new StringBuilder(); for (Paire p : keySet()) { docSet.add(p.doc); rqtSet.add(p.rqt); } for (String rqt : rqtSet) sb.append('\t').append(rqt); int i=0, j=0; int nDoc = docSet.size(); int nRqt = rqtSet.size(); String[] docTab = docSet.toArray(new String[nDoc]); for (double d : values()) { if (i++ % nRqt == 0) sb.append(System.lineSeparator()).append(docTab[j++]); sb.append('\t').append(d); } return sb.toString(); }