Je sais que nous pouvons ajouter des chaînes en utilisant StringBuilder
. Existe-t-il un moyen de pré-ajouter des chaînes (c'est-à-dire d'ajouter des chaînes devant une chaîne) en utilisant StringBuilder
afin de pouvoir conserver les avantages de performances que cela StringBuilder
offre?
c#
java
stringbuilder
burnt1ce
la source
la source
Réponses:
Utiliser la méthode d'insertion avec le paramètre de position réglé sur 0 serait le même que le préfixe (c'est-à-dire l'insertion au début).
Un exemple est:
varStringBuilder.insert(0, "someThing");
Cela fonctionne à la fois pour C # et Java
la source
La pré-attente d'une chaîne nécessitera généralement de copier tout après le point d'insertion en arrière dans le tableau de sauvegarde, donc ce ne sera 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 est appelée
Insert
):la source
Si vous avez besoin de hautes performances avec beaucoup de préfixes, vous devrez écrire votre propre version de
StringBuilder
(ou utiliser celle de quelqu'un d'autre). Avec la normeStringBuilder
(bien que techniquement, cela puisse être implémenté 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 le
char[]
tampon de support ainsi que la longueur. Lorsqu'il n'y a pas assez de place pour un préfixe, déplacez les données plus que 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 manière, l'espace disponible aux deux extrémités du réseau devient contigu.la source
Vous pouvez essayer une méthode d'extension:
la source
Vous pouvez créer la chaîne à l'envers, puis inverser le résultat. Vous engagez un coût O (n) au lieu d'un coût O (n ^ 2) dans le pire des cas.
la source
Je ne l'ai pas utilisé mais Ropes For Java semble intriguant. Le nom du projet est un jeu de mots, utilisez une corde au lieu d'une chaîne pour un travail sérieux. Contourne la pénalité des performances pour les opérations en préfixe et autres. Vaut le détour, si vous allez faire beaucoup de ça.
la source
Voici ce que vous pouvez faire si vous souhaitez ajouter un préfixe à l'aide de la classe StringBuilder de Java:
la source
Si je vous comprends bien, la méthode d'insertion semble faire ce que vous voulez. Insérez simplement la chaîne à l'offset 0.
la source
Essayez d'utiliser Insert ()
la source
À en juger par les autres commentaires, il n'y a pas de moyen rapide standard de le faire. L'utilisation de StringBuilder
.Insert(0, "text")
est environ 1 à 3 fois plus rapide que l'utilisation d'une concaténation de chaînes extrêmement lente (basée sur plus de 10000 concats), vous trouverez donc ci-dessous une classe à ajouter potentiellement des milliers de fois plus rapidement!J'ai inclus d'autres fonctionnalités de base telles que
append()
,subString()
etlength()
etc. Les deux et précèder varient y ajouter ses environ deux fois plus vite à 3 fois plus lent que StringBuilder ajoute. Comme StringBuilder, la mémoire tampon de cette classe augmente automatiquement lorsque le texte dépasse l'ancienne taille de la mémoire tampon.Le code a été testé beaucoup, mais je ne peux pas garantir qu'il soit exempt de bogues.
la source
Vous pouvez créer vous-même une extension pour StringBuilder avec une classe simple:
Ensuite, ajoutez simplement:
En haut de toute classe dans laquelle vous souhaitez utiliser StringBuilder et chaque fois que vous utilisez intelli-sense avec une variable StringBuilder, les méthodes Prepend et PrependLine s'affichent. N'oubliez pas que lorsque vous utilisez Prepend, vous devrez ajouter Prepend dans l'ordre inverse de celui que vous aviez ajouté.
la source
Cela devrait fonctionner:
la source
string
, mais ne fonctionne pas avec les valeurs de typeStringBuilder
. La réponse de @ScubaSteve fonctionne bien.