deleteCharAt ou setLength, ce qui est mieux pour supprimer le dernier caractère de l'un StringBuilder/StringBuffer
Dans de nombreux cas, nous avons besoin de supprimer le dernier char de un StringBuilder/StringBuffer. Par exemple, étant donné un int[]{1,2,3}
, pour mettre en œuvre un String toString(int[] a)
méthode, communiquant avec chacun des éléments avec une virgule comme séparateur. La sortie doit être 1,2,3
, pas de résidus par des virgules.
On peut facilement écrire une boucle:
int[] nums = new int[]{1,2,3,4,5};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]);
sb.append(",");
}
//here we need to remove the tailing ','
mais nous avons toujours besoin d'enlever les résidus de ','
. Il y a deux façons de la mettre en œuvre:
sb.deleteCharAt(sb.length() - 1);
et
sb.setLength(sb.length() - 1);
Dont l'une est recommandé? Pourquoi?
NOTE:
Je sais que ce n' Arrays.toString
faire. C'est juste un exemple pour décrire ma question, peut-être pas tout à fait correct.
Ce n'est pas une discussion à propos des chaînes de concaténation, mais les meilleures pratiques de StringBuffer/StringBuilder.
Arrays.toString(nums)
? et puis supprimer le premier et le dernier char. Mais une bonne question à propos de l'usage général.D'accord avec vous. J'ai édité ma question.
J'ai trouvé très proche de la question à la vôtre dans le CodeReview.SE.
Cette réponse de @jon-skeet donne une excellente alternative à l'utilisation de StringBuilder sans enlever tout résidus.
OriginalL'auteur Weibo Li | 2014-02-08
Vous devez vous connecter pour publier un commentaire.
En fait, il y a très peu et dépend probablement de matériel et d'autres facteurs.
La
setLength()
méthode modifie le comte et écrase les indésirables de la valeur dans le tableau avec un zéro octet.La
deleteCharAt()
effectue un tableau copie en interne, avant de modifier le comte. Cela peut sembler dramatique, mais le tableau est copié est effectivement zéro-longueur parce que vous êtes à la suppression du dernier caractère.Je vous recommande d'aller pour
setLength()
que c'est plus court à taper et je pense que rend plus claire de ce que vous faites. Si la performance est un problème et, sur la mesure de, vous trouverez ce qui est le goulot d'étranglement pour vous, alors vous pourriez peut-être envisager une autre algorithme qui ne nécessite pas de modification de la taille (comme par JB Nizet réponse).OK, c'est plus court à lire.
+1: les deux ont un coût négligeable. Utilisez ce que vous trouvez le plus clair pour vous.
OriginalL'auteur ᴇʟᴇvᴀтᴇ
Comment vous le faites correctement est conditionnelle, ajouter la virgule:
Alors vous n'avez pas besoin de vous soucier de la suppression du dernier caractère, parce que c'est déjà correct.
OriginalL'auteur Bohemian
Je ne ferais pas comme ça. Au lieu de cela, je tiens seulement à ajouter une virgule si l'élément n'est pas le dernier élément du tableau. Ou je voudrais utiliser la Goyave du Menuisier (ou Apache commons StringUtils), ce qui le rend beaucoup plus clair:
NB: je viens de remarquer que la Goyave est Menuisier ne s'occupe pas de primitive de tableaux. Vous devriez obtenir l'idée de l'idée au-dessus de toute façon.
La meilleure pratique, pour moi, est d'éviter de ajoutant des des choses que vous savez que vous aurez à enlever après. Peut-être que vous devez venir avec un cas d'utilisation où il est vraiment nécessaire. Je ne me souviens pas avoir eu à le faire dans les années de la programmation en Java.
OriginalL'auteur JB Nizet