Déclaration de String en JAVA

Fermé
javaazer Messages postés 5 Date d'inscription dimanche 27 février 2011 Statut Membre Dernière intervention 20 avril 2011 - 26 mars 2011 à 12:52
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 27 mars 2011 à 13:40
Bonjour,

Je veux déclarer une chaine de caractères de longueur 10 commençant par la lettre 'A'

public StringBuffer chaine=new StringBuffer(10);
chaine.append('A'); //ne marche pas !

S'il vous plait je veux savoir comment le réaliser !
Merci beaucoup !

A voir également:

4 réponses

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 26/03/2011 à 14:05
Tu dois faire la distinction entre la capacité et la taille d'une chaîne de caractères.
La capacité c'est le nombre de caractères qu'elle peut contenir et la taille c'est le nombre de caractères qu'elle contient effectivement.

La capacité d'un StringBuffer est ajustée dynamiquement au fur et à mesure qu'on en modifie le contenu. C'est d'ailleurs la différence avec un String qui a une capacité fixée à sa construction et qui ne peut pas être redimensionné. Lors de la modification de la taille d'un String, Java est obligé de construire un nouveau String avec la bonne capacité.

StringBuffer chaine=new StringBuffer(10);  
System.out.println(chaine.capacity()); // 10 
System.out.println(chaine.length());   // 0 
chaine.append('A'); 
System.out.println(chaine.capacity()); // 10 
System.out.println(chaine.length());   // 1 
chaine.append("0123456789"); 
System.out.println(chaine.capacity()); // 22 : ajustée dynamiquement 
System.out.println(chaine.length());   // 11 

Si tu veux que la taille soit exactement de 10 caractères, tu dois préciser quels sont les 9 caractères suivants le 'A'. Ou alors tu peux faire un tableau de 10 caractères et laisser Java remplir par défaut les 9 derniers caractères (a priori par le caractère 0).

String str1 = "A_________";  
System.out.println(str1.length()); // 10  

char[] tab = new char[10]; // Remarque : on utilise souvent byte[]
tab[0]='A';  
String str2 = new String(tab);  
System.out.println(str2.length()); // 10

La confiance n'exclut pas le contrôle
1
Utilisateur anonyme
26 mars 2011 à 19:59
Salut,

Ou bien par exemple:

StringBuffer chaine=new StringBuffer(10); 
         chaine.append('A'); //ne marche pas !
         System.out.println("chaine: " + "\"" + chaine + "\"");
          for(int i = 0; i < chaine.capacity() -2; i++) // -2 car A existe
            chaine.append(i); // ou tout autre caractère
         System.out.println("chaine: " + "\"" + chaine + "\"");

Cordialement,

Dan
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
26 mars 2011 à 20:25
Tu as un problème dans ta boucle, au final tu obtient une chaîne de taille 9 et pas 10.
De plus rajouter un int est bizarre, ça va bien se passer tant que ce sera des chiffres.
Au delà il va rajouter à chaque fois autant de caractères qu'il y a de chiffres et ça va planter.

Avec ton code :
Si on initialise à 10 : chaine: "A01234567" // 9 caractères
Si on initialise à 13 : chaine: "A012345678910" // ici on a ajouté 2 caractères pour 10
Si on initialise à 14 : java.lang.OutOfMemoryError: Java heap space

Voici comment réparer ce bug dans le cas général :

for (int i=chaine.length(); i<chaine.capacity(); i++)
    	 chaine.append('_');
System.out.println(chaine.length()+"=="+chaine.capacity());
0
Utilisateur anonyme
27 mars 2011 à 00:38
Oui effectivement on obtient : chaine: "A01234567".
J'ai copié mon premier code aulieu de celui-ci:

StringBuffer chaine=new StringBuffer(10); 
         chaine.append('A');
         System.out.println("chaine: " + "\"" + chaine + "\"");
         
         for(int i = 0; i < chaine.capacity() -1; i++) // soit < 9 car A existe déjà
            chaine.append(i); // ou tout autre caractère
         System.out.println("chaine: " + "\"" + chaine + "\"");
      	
      	// ou bien
      
         StringBuffer chaine2 = new StringBuffer(10); 
         chaine2.append('A');
         System.out.println("chaine2: " + "\"" + chaine2 + "\"");
         
         chaine2.append("BCDEFGHIJ"); // ou tout autre caractère
         System.out.println("chaine2: " + "\"" + chaine2 + "\"");


J'ai ajouté un autre cas...

Dan
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 27/03/2011 à 12:41
Là encore, ton append(i) marchera parce qu'on est en dessous de 10 et qu'il n'y a qu'un chiffre, mais au delà se sera une suite de chiffres, donc une suite de caractères et ça va planter comme je l'avais montré dans mon exemple précédent (à partir de 12 avec ce code)

Cela vient du fait que l'ajustement dynamique de StringBuffer augmente la capacité de la chaîne de caractères pour pouvoir ajouter tous les chiffres de i, mais vu la condition d'arrêt du for on rentre alors dans une boucle infinie jusqu'à atteindre l'erreur OutOfMemory...

Plutôt que d'utiliser append(i) considère soit append(i%10) soit append((char)i) qui tous deux rajoutent un unique caractère à chaque fois, quelque soit la valeur de i (positive !)
0
Utilisateur anonyme
27 mars 2011 à 13:33
Ça marche tout simplement parceque javaazer veut créer une chaîne de caractères de longueur 10 commençant par la lettre 'A' en utilisant un StringBuffer et que c'est ce que font mes 2 derniers codes.

Pourquoi nier systèmatiquement l'évidence ?
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 27/03/2011 à 13:41
Je ne nie pas que ça marche, d'ailleurs je l'ai dit "marchera parce qu'on est en dessous de 10"
Mais si demain javaazer veut utiliser le même code pour une chaîne de 15 caractères ça ne marchera plus, et j'apporte juste un complément à ton code pour expliquer pourquoi ça ne marcherait pas dans le cas général. CommentCaMarche est un forum d'entraide, c'est dans ce sens que je l'utilise.
0
mathieu.u Messages postés 4 Date d'inscription dimanche 27 mars 2011 Statut Membre Dernière intervention 25 novembre 2015
27 mars 2011 à 11:22
public class tmp {
public static void main(String argv[]) {
StringBuffer sb = new StringBuffer(10);
String str=" ";
sb.append("A");
for(int i=1;i<10;i++){
sb.append(str);
}
System.out.println(sb.length()+"-------"+sb.toString());
}
}
Résultats:
10-------A
0