Somme de Maps
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 à 23:03
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 13 nov. 2012 à 00:09
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 13 nov. 2012 à 00:09
A voir également:
- Somme de Maps
- Google maps satellite - Guide
- Somme si couleur - Guide
- Coordonnées gps google maps - Guide
- Somme excel - Guide
- Google maps - Télécharger - Transports & Cartes
4 réponses
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
11 nov. 2012 à 23:42
11 nov. 2012 à 23:42
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
}
omidaoui
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017
12 nov. 2012 à 00:03
12 nov. 2012 à 00:03
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
omidaoui
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017
12 nov. 2012 à 00:06
12 nov. 2012 à 00:06
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
omidaoui
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017
12 nov. 2012 à 21:46
12 nov. 2012 à 21:46
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
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
Modifié par KX le 12/11/2012 à 22:23
Modifié par KX le 12/11/2012 à 22:23
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.
omidaoui
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017
12 nov. 2012 à 23:19
12 nov. 2012 à 23:19
^_____^, je suis vraiment bloquee, j'arrive pas a afficher la matrice parfaitement
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
12 nov. 2012 à 23:21
12 nov. 2012 à 23:21
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();
}
}
omidaoui
Messages postés
32
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
2 décembre 2017
12 nov. 2012 à 23:36
12 nov. 2012 à 23:36
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
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
13 nov. 2012 à 00:09
13 nov. 2012 à 00:09
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();
}