saut de ligne portable

saut de ligne portable - Java - Programmation

Marsh Posté le 20-12-2005 à 12:48:25    

Bonjour, je voudrait reécire une méthode toString, mais cell-ci renvoi un string avec des saut de ligne.  
 

Code :
  1. public String toString(){
  2.  String toString = new String();
  3.  for (Iterator iter = listePoint.iterator(); iter.hasNext();){
  4.   toString = toString.concat((iter.next()).toString()+ "\n" );
  5.  }
  6.  return toString;
  7. }


 
Comme je voudrais éviter "\n" qui, il me semble, n'est pas portable sur tout les systeme, il me faudrait un moyen pour le remplacer de maniere portable.
 
Merci

Reply

Marsh Posté le 20-12-2005 à 12:48:25   

Reply

Marsh Posté le 20-12-2005 à 13:13:06    

Ptin mais [:pingouino]
 
1- http://www.justfuckinggoogleit.com [...] va+newline
2- Faut utiliser un StringBuffer/StringBuilder quand tu fais des concaténations de strings, c'est fait pour ça.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 15:23:16    

Ok. merci pour la réponse.
 
Par contre, j'ai dus mal à comprendre pourquoi utilisé StringBuffer et WriteBuffer (où il est écrit "which can then be used to construct a string" ) plutot que String et concat.  
 
Pour google, j'ai essayé de faire mes recherche, mais j'utilisé pas le bon mot clef; erreur de débutant.

Reply

Marsh Posté le 20-12-2005 à 15:38:12    

blaise_laporte a écrit :

Ok. merci pour la réponse.
 
Par contre, j'ai dus mal à comprendre pourquoi utilisé StringBuffer et WriteBuffer (où il est écrit "which can then be used to construct a string" ) plutot que String et concat.  
 
Pour google, j'ai essayé de faire mes recherche, mais j'utilisé pas le bon mot clef; erreur de débutant.


 
Parce que les String sont des objets immuables. C'est à dire qu'a chaque fois que tu fais une concatenation de 2 strings, ça va en instancier une 3ème.
 

Reply

Marsh Posté le 20-12-2005 à 15:42:46    

Bidem a écrit :

Parce que les String sont des objets immuables. C'est à dire qu'a chaque fois que tu fais une concatenation de 2 strings, ça va en instancier une 3ème.


 
donc lorsqu'on a besoin d'une chaine qui doit être mise à jour souvent dans une application, on gagne en ressources d'utiliser StringBuffer ou autres plutôt que String, c'est ça ?


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 20-12-2005 à 15:59:43    

Oui, surtout si cette chaine est construite par concatenation
 
ex :

Code :
  1. String s = "1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + "10";


Nombre de création d'instances de String => 19
Successivement en mémoire on aura les String suivantes de crées
"1", "2", "12", "3", "123", "4", "1234", "5", "12345", "6", "123456", "7", "1234567", "8", "123456789", "9", "123456789", "10", "12345678910" ...
 
Avec un StringBuffer maintenant :

Code :
  1. StringBuffer buff = new StringBuffer();
  2. buff.append("1" ).append("2" ).append("3" ).append("4" )
  3.   .append("5" ).append("6" ).append("7" ).append("8" )
  4.   .append("9" ).append("10" );
  5. s.toString()


  => 11 strings d'instanciées et 1 seul StringBuffer (on évite toutes les chaine intermédiaire en fait)
 
 
EDIT : Le principal inconvénient, c'est qu'on perd un peu en lisibilité du code


Message édité par Bidem le 20-12-2005 à 16:01:16
Reply

Marsh Posté le 20-12-2005 à 16:12:42    

les String "intermédiaires" dues à la simple concaténation ne sont pas détruits par le GC ?


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 20-12-2005 à 16:27:41    

Citation :

les String "intermédiaires" dues à la simple concaténation ne sont pas détruits par le GC ?


 
Je pense que si, mais il y a tout de même leur création qui prend de la ressource.
(C'est ça? (test pour savoir si j'ai bien suivit...))
 
Merci beaucoup Bidem!! [:athome] Grace à toi, je me coucherai moins bête ce soir!  :bounce:

Reply

Marsh Posté le 20-12-2005 à 16:44:29    

Voila, comme expliqué par Bidem.
 
Sauf qu'il manque des morceaux, en bonus les dernières JVM utilisent StringBuilder en interne, mais ne sont pas assez "intelligentes" pour le placer à l'extérieur des boucles.
 
Résultat, l'exemple de Bidem avec une JVM 1.5 server serait intégralement convertie en StringBuffer, mais la fonction toString initiale serait compilée en un truc du genre:

Code :
  1. public String toString() {
  2.    String toString = new String();
  3.    for(Iterator iter = listPoint.iterator(); iter.hasNext();) {
  4.        StringBuilder temp = new StringBuilder(toString);
  5.        temp.append((iter.next()).toString());
  6.        temp.append("\n" );
  7.        toString = temp.toString();
  8.    }
  9.    return toString;
  10. }


(ça donnerait probablement pas exactement ce code, mais pas loin)
 
Résultat, création d'un String initial, création d'un StringBuffer à chaque itération, création d'un String à chaque itération (par StringBuffer.toString).
 
Ca fait beaucoup :o
 
Surtout quand on peut coder

Code :
  1. public String toString() {
  2.    StringBuffer output;
  3.    for(Iterator iter = listPoint.iterator(); iter.hasNext();) {
  4.        output.append((iter.next()).toString());
  5.        output.append(System.getProperty("line.separator" ));
  6.    }
  7.    return output.toString;
  8. }


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 16:47:33    

blaise_laporte a écrit :

Citation :

les String "intermédiaires" dues à la simple concaténation ne sont pas détruits par le GC ?


 
Je pense que si, mais il y a tout de même leur création qui prend de la ressource.
(C'est ça? (test pour savoir si j'ai bien suivit...))
 
Merci beaucoup Bidem!! [:athome] Grace à toi, je me coucherai moins bête ce soir!  :bounce:


 
C'est tout à fait ça, l'instanciation et le gc, n'ont pas un coût négrigeable  
 
Sinon, pour ta 1ère question : Cf Le tutorial Java est notre ami, il faut le regarder aussi  :p ("line.separator" ) EDIT : Grilled !

Message cité 3 fois
Message édité par Bidem le 20-12-2005 à 16:48:48
Reply

Marsh Posté le 20-12-2005 à 16:47:33   

Reply

Marsh Posté le 20-12-2005 à 16:49:26    

Bidem a écrit :

C'est tout à fait ça, l'instanciation et le gc, n'ont pas un coût négrigeable  
 
Sinon, pour ta 1ère question : Cf Le tutorial Java est notre ami, il faut le regarder aussi  :p ("line.separator" ) EDIT : Grilled !


 
ok, tjs bon à savoir :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 20-12-2005 à 16:53:48    

Bidem a écrit :

C'est tout à fait ça, l'instanciation et le gc, n'ont pas un coût négrigeable


Me semble que le GC de la JVM est un mark&sweep non [:petrus dei]
 
Donc son coût est quasi toujours négligeable, par contre l'instanciation ne l'est clairement pas


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-12-2005 à 17:24:08    

Bidem a écrit :

C'est tout à fait ça, l'instanciation et le gc, n'ont pas un coût négrigeable


 
C'est moins une question d'"instanciation" ou de GC qu'une question générale de complexité. La complexité de buffer.append("1" ).append("2" )....append("n" ) est linéaire alors que celle de la concaténation buffer = "1" + "2" + ... + "n" est quadratique.
 
L'histoire d'instancier moins d'objets ou de donner moins de boulot au GC c'est des problèmes d'optimisations qui sont différent du fond du problème. :o

Reply

Marsh Posté le 20-12-2005 à 17:42:34    

Hummm pas sûr du tout, pour moi les 2 sont linéaires.
 
buffer.append("1" ).append("2" )....append("n" ) => n appels de append impliquant (n + 1) objets
"1" + "2" + ... + "n" => (n - 1) concatenation, mais sur n + (n-1) objets
 
Mais peut être me trompe-je

Message cité 1 fois
Message édité par Bidem le 20-12-2005 à 17:43:01
Reply

Marsh Posté le 20-12-2005 à 17:51:57    

Bidem a écrit :

Hummm pas sûr du tout, pour moi les 2 sont linéaires.
 
buffer.append("1" ).append("2" )....append("n" ) => n appels de append impliquant (n + 1) objets
"1" + "2" + ... + "n" => (n - 1) concatenation, mais sur n + (n-1) objets
 
Mais peut être me trompe-je


 
Tu te trompes parce que l'énoncé est trompeur. :D
 
Le "n" ici représente dans le premier cas (avec "append" ) le nombre de caractère copiés, donc c'est linéaire.
 
En revanche, dans le deuxième cas il y a bien n-1 concaténations, mais la complexité d'une concaténation n'est certainement pas constante ! Elle est elle aussi linéaire. Finalement dans le deuxième cas on effectue 2+3+4+...+n copies de caractère, c'est à dire n(n+1)/2 - 1 copies en tout ce qui donne bien une complexité quadratique. :)


Message édité par Profil supprimé le 20-12-2005 à 17:55:36
Reply

Marsh Posté le 20-12-2005 à 18:02:56    

Ha oui, tiens t'as raison ;)

Reply

Marsh Posté le 21-12-2005 à 04:36:31    

mask>StringBUFFER en interne, pas builder. je crois :o
(Sbuilder n'est pas threadsafe)
 
HAHAHA A PART CA J4AI DIT UINE CONNERIE DONC J4EDITE COMME UIN POURCEAU

Message cité 1 fois
Message édité par the real moins moins le 21-12-2005 à 04:37:40

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 21-12-2005 à 11:16:04    

the real moins moins a écrit :

mask>StringBUFFER en interne, pas builder. je crois :o
(Sbuilder n'est pas threadsafe)


Ué bon s'possible c'est toi l'expert java pas moi :kaola:  
(puis bon pour lui ça change rien quoi)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed