Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1036 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  saut de ligne portable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

saut de ligne portable

n°1270616
blaise_lap​orte
Posté le 20-12-2005 à 12:48:25  profilanswer
 

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

mood
Publicité
Posté le 20-12-2005 à 12:48:25  profilanswer
 

n°1270622
masklinn
í dag viðrar vel til loftárása
Posté le 20-12-2005 à 13:13:06  profilanswer
 

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
n°1270809
blaise_lap​orte
Posté le 20-12-2005 à 15:23:16  profilanswer
 

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.

n°1270830
Bidem
Posté le 20-12-2005 à 15:38:12  profilanswer
 

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.
 

n°1270835
trevor
laissez la vie vous étonner...
Posté le 20-12-2005 à 15:42:46  profilanswer
 

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
n°1270844
Bidem
Posté le 20-12-2005 à 15:59:43  profilanswer
 

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
n°1270859
trevor
laissez la vie vous étonner...
Posté le 20-12-2005 à 16:12:42  profilanswer
 

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
n°1270874
blaise_lap​orte
Posté le 20-12-2005 à 16:27:41  profilanswer
 

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:

n°1270894
masklinn
í dag viðrar vel til loftárása
Posté le 20-12-2005 à 16:44:29  profilanswer
 

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
n°1270899
Bidem
Posté le 20-12-2005 à 16:47:33  profilanswer
 

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
mood
Publicité
Posté le 20-12-2005 à 16:47:33  profilanswer
 

n°1270903
trevor
laissez la vie vous étonner...
Posté le 20-12-2005 à 16:49:26  profilanswer
 

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
n°1270910
masklinn
í dag viðrar vel til loftárása
Posté le 20-12-2005 à 16:53:48  profilanswer
 

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
n°1270935
Profil sup​primé
Posté le 20-12-2005 à 17:24:08  answer
 

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

n°1270947
Bidem
Posté le 20-12-2005 à 17:42:34  profilanswer
 

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
n°1270953
Profil sup​primé
Posté le 20-12-2005 à 17:51:57  answer
 

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
n°1270961
Bidem
Posté le 20-12-2005 à 18:02:56  profilanswer
 

Ha oui, tiens t'as raison ;)

n°1271020
the real m​oins moins
Posté le 21-12-2005 à 04:36:31  profilanswer
 

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 ?
n°1271123
masklinn
í dag viðrar vel til loftárása
Posté le 21-12-2005 à 11:16:04  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  saut de ligne portable

 

Sujets relatifs
Réalisation d'une aide en ligne[Heeelp] PHP en ligne de commande
InputStreamReader et lecture de fichiers ligne par ligneproblème spam via formulaire en ligne
[ACCESS] plusieurs ligne d'update dans une requeteJTable obtenir le contenu du ligne selectionné
Compter le nombre de ligne dans un fichier texte sous Windows[c++/linux] mise en page en ligne de commande
récuperation de l'Index automatique apres création d'une ligneRemplacer N° de ligne cellules par variables
Plus de sujets relatifs à : saut de ligne portable


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR