142 votes

Comment prépendre des chaînes de caractères avec StringBuilder ?

Je sais que nous pouvons ajouter des chaînes de caractères en utilisant StringBuilder . Existe-t-il un moyen d'ajouter des chaînes au préalable (c'est-à-dire d'ajouter des chaînes devant une chaîne) à l'aide de la fonction StringBuilder afin que nous puissions conserver les avantages de performance que StringBuilder offre ?

217voto

driis Points 70872

L'utilisation de la méthode d'insertion avec le paramètre de position défini sur 0 équivaudrait à une insertion préalable (c'est-à-dire une insertion au début).

Un exemple : varStringBuilder.Insert(0, "someThing");

Il fonctionne à la fois pour C# y Java

7 votes

StringBuilder insert pour java : java.sun.com/j2se/1.5.0/docs/api/java/lang/

0 votes

La JavaDoc correcte pour l'API concernée est la suivante : [docs.oracle.com/javase/1.5.0/docs/api/java/lang/](http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html#insert(int,%20java.lang.CharSequence%29)

34voto

Joachim Sauer Points 133411

L'insertion préalable d'une chaîne nécessite généralement de recopier tout ce qui se trouve après le point d'insertion dans le tableau de sauvegarde, ce qui n'est pas aussi rapide que l'ajout à la fin.

Mais vous pouvez le faire comme ceci en Java (en C# c'est la même chose, mais la méthode s'appelle Insert ):

aStringBuilder.insert(0, "newText");

15voto

Si vous avez besoin de hautes performances avec beaucoup de prépensions, vous devrez écrire votre propre version de StringBuilder (ou utiliser celui de quelqu'un d'autre). Avec la norme StringBuilder (bien que techniquement cela pourrait être mis en œuvre différemment) l'insertion nécessite de copier les données après le point d'insertion. L'insertion de n morceaux de texte peut prendre O(n^2) temps.

Une approche naïve consisterait à ajouter un décalage dans la sauvegarde. char[] ainsi que la longueur. Lorsqu'il n'y a pas assez de place pour un prepend, déplacez les données vers le haut plus que ce qui est strictement nécessaire. Cela peut ramener les performances à O(n log n) (je pense). Une approche plus raffinée consiste à rendre le tampon cyclique. De cette façon, l'espace libre aux deux extrémités du tableau devient contigu.

6voto

bright Points 856

Vous pourriez construire la chaîne en sens inverse et ensuite inverser le résultat. Vous encourrez un coût O(n) au lieu d'un coût O(n^2) dans le pire des cas.

5 votes

Cela ne fonctionne que si vous ajoutez des caractères individuels. Sinon, il faudrait inverser chaque chaîne ajoutée, ce qui absorberait la plupart, voire la totalité, des économies réalisées en fonction de la taille et du nombre de chaînes.

4voto

Sam Barnum Points 5019

Je ne l'ai pas utilisé mais Cordes pour Java Cela semble intriguant. Le nom du projet est un jeu de mots, utiliser un Cordage au lieu d'un Chaîne de caractères pour un travail sérieux. Elle permet de contourner la pénalité de performance pour les opérations de prépositionnement et autres. Cela vaut la peine d'y jeter un coup d'œil, si vous avez l'intention de faire beaucoup de choses de ce genre.

Une corde est un remplacement de haute performance remplacement des cordes. La structure de données structure de données, décrite en détail dans "Cordes : une alternative à Strings", fournit des performances asymptotiquement meilleures performance que String et StringBuffer pour les modifications courantes comme prepend, append, delete, et insert. Comme les chaînes de caractères, cordes sont immuables et donc bien adaptées à la programmation multithread. programmation multithread.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X