IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Affichage "propre" d'une matrice


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Affichage "propre" d'une matrice
    Bonjour à tous.

    je travail actuellement sur une classe représentant les matrices, je travail en console uniqument, pas d'interface graphique.
    Le problème intervient lorsque je veux afficher ma matrice en sortie sur la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public String toString() {
    		String s = "";
     
    		for (int i = 0; i < this.M; i++) {
    			for(int j = 0; j < this.N; j++)
    				s += this.data[i][j] + "  ";
    			s += "\n";
    		}
     
    		return s;
    	}
    Pour une matrice comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    double[][] d = {
    			{4, 6, 9},
    			{3, 5, 2}
    		};
     
    		Matrix m = new Matrix(d);
    		System.out.println(m);
    J'ai un affichage propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    4.0  6.0  9.0  
    3.0  5.0  2.0
    Mais si je j'ai des plus gros nombres pas endroit, j'ai un affichage décalé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    4.0  690.0  9.0  
    32334.0  5.0  2.0
    J'aimerai trouver un moyen pour que l'affichage soit bien aligné, peut importe les nombres dans ma matrice. Avez vous une astuce ?
    Merci

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Si tu connais la syntaxe "a la printf", tu as par exemple String.format(); Mais il y'a d'autres moyens.

    https://docs.oracle.com/javase/tutor...berformat.html
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Déjà attention car ta méthode toString() est très dangereuse : il ne faut pas modifier une String avec += dans une boucle !!
    En effet ceci génère plusieurs objets temporaires, ce qui rend le code très gourmand en mémoire, et donc très lent.
    Et ceci de manière exponentielle plus on augmente le nombre d'itération du tableau.

    Par exemple le code suivant prend plus de 38 secondes sur ma machine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		double[][] d = new double[400][400];
     
    		Matrix m = new Matrix(d);
     
    		long t0 = System.currentTimeMillis();
    		String s= m.toString();
    		long t1 = System.currentTimeMillis();
    		System.out.println((t1-t0)+"ms");

    La bonne manière de faire consiste à utiliser un StringBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	@Override
    	public String toString() {
    		StringBuilder sb = new StringBuilder();
     
    		for (int i = 0; i < this.M; i++) {
    			for(int j = 0; j < this.N; j++) {
    				sb.append(this.data[i][j]).append("  ");
    			}
    			sb.append("\n");
    		}
     
    		return sb.toString();
    	}
    Et là le code précédent passe de 38 secondes à 34... milli-secondes !

    Avec StringBuilder j'ai dû monter à un tableau de 5000x5000 pour dépasser la seconde d'exécution...
    Dans ce cas la limite vient plus de la mémoire disponible qu'autre chose.





    Maintenant pour en revenir à ton problème et comme le dit wax78 la solution la plus simple consiste à utiliser String.format() pour formater le nombre.
    Par exemple pour l'afficher sur 10 caractères maximum avec 2 décimales tu peux utiliser String.format("%10.2f", this.data[i][j]) ...
    Reste juste à déterminer la longueur. Soit tu mets une valeur fixe suffisamment grande, soit tu dois parcourir tes données pour la déterminer à l'avance...





    Dernière remarque si tu dois afficher de très grosse matrice, System.out.println(m) est inefficace.
    En effet tu vas créer une String énorme avant de l'afficher. Il est préférable d'afficher tout directement dans le flux.
    Tu peux faire cela simplement via l'interface Appendable afin de ne pas dupliquer le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    	public void appendTo(Appendable output) throws IOException {
    		for (int i = 0; i < this.M; i++) {
    			for(int j = 0; j < this.N; j++) {
    				String value = String.format("%10.2f", this.data[i][j]);
    				output.append(value);
    				output.append("  ");
    			}
    			output.append("\n");
    		}
    	}
     
    	@Override
    	public String toString() {
    		StringBuilder sb = new StringBuilder();
    		try {
    			appendTo(sb);
    		} catch (IOException e) {
    			// Ceci ne devrait pas arriver :
    			throw new IllegalStateException(e);
    		}
    		return sb.toString();
    	}
    Désormais tu peux remplacer System.out.println(m) par m.appendTo(System.out) pour plus d'efficacité.


    a++

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Merci à vous, je regarde ça et je vous donne des nouvelles

Discussions similaires

  1. affichage de l'image d'une matrice
    Par nounadevelop dans le forum Windows Forms
    Réponses: 9
    Dernier message: 29/05/2008, 01h19
  2. affichage d'un histogramme d'une matrice aleatoire
    Par boinamib dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 16/05/2007, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo