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   -
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
A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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.

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
}
0
omidaoui Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
omidaoui Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
omidaoui Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Comme ceci par exemple (à mettre dans ma classe Data)

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.
0
omidaoui Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
^_____^, je suis vraiment bloquee, j'arrive pas a afficher la matrice parfaitement
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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();
    }    
}
0
omidaoui Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
non, c pa l'affichage de la matrice en nombre ki me maque, mais plutot laffichage de la matrice avex les entete c a d les termes requetes en haut et l'ensemble des termes de tout les Doc dans les debut des lignes
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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.

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();
}
0