Eu sei que podemos anexar strings usando StringBuilder
. Existe uma maneira de acrescentar strings antes de uma string (ou seja, adicionar strings na frente de uma string) usando StringBuilder
para que possamos manter os benefícios de desempenho que isso StringBuilder
oferece?
c#
java
stringbuilder
burnt1ce
fonte
fonte
Respostas:
Usar o método de inserção com o parâmetro de posição definido como 0 seria o mesmo que prefixar (ou seja, inserir no início).
Um exemplo é:
varStringBuilder.insert(0, "someThing");
Funciona tanto para C # quanto para Java
fonte
Anexar uma string normalmente exigirá copiar tudo após o ponto de inserção de volta na matriz de apoio, portanto, não será tão rápido quanto anexar no final.
Mas você pode fazer assim em Java (em C # é o mesmo, mas o método é chamado
Insert
):fonte
Se você precisar de alto desempenho com muitos prefixos, precisará escrever sua própria versão do
StringBuilder
(ou usar a de outra pessoa). Com o padrãoStringBuilder
(embora tecnicamente possa ser implementado de forma diferente), a inserção exige a cópia dos dados após o ponto de inserção. A inserção de n partes de texto pode levar O (n ^ 2) tempo.Uma abordagem ingênua seria adicionar um deslocamento no
char[]
buffer de apoio , bem como o comprimento. Quando não houver espaço suficiente para um prefixo, mova os dados mais do que o estritamente necessário. Isso pode trazer o desempenho de volta para O (n log n) (eu acho). Uma abordagem mais refinada é tornar o buffer cíclico. Dessa forma, o espaço livre em ambas as extremidades da matriz torna-se contíguo.fonte
Você pode tentar um método de extensão:
fonte
Você pode construir a string ao contrário e depois inverter o resultado. Você incorre em um custo O (n) em vez de um custo O (n ^ 2) no pior caso.
fonte
Eu não usei, mas Ropes For Java parece intrigante. O nome do projeto é um jogo de palavras, use uma corda em vez de uma corda para um trabalho sério. Contorna a penalidade de desempenho para operações de anteposição e outras Vale a pena dar uma olhada, se você vai fazer muito isso.
fonte
Aqui está o que você pode fazer se desejar preceder usando a classe StringBuilder do Java:
fonte
Se bem entendi, o método de inserção parece que fará o que você quiser. Basta inserir a string no deslocamento 0.
fonte
Tente usar Insert ()
fonte
A julgar pelos outros comentários, não há uma maneira rápida padrão de fazer isso. Usar StringBuilder
.Insert(0, "text")
é aproximadamente apenas 1-3x mais rápido do que usar concatenação de String dolorosamente lenta (com base em> 10.000 concats), portanto, abaixo está uma classe para prefixar potencialmente milhares de vezes mais rápido!Eu incluí algumas outras funcionalidades básicas, tais como
append()
,subString()
elength()
etc. Ambos os Anexa e prepends variar de cerca de duas vezes mais rápido para 3x mais lento do que StringBuilder anexa. Como StringBuilder, o buffer nesta classe aumentará automaticamente quando o texto ultrapassar o tamanho do buffer antigo.O código foi bastante testado, mas não posso garantir que esteja livre de bugs.
fonte
Você mesmo poderia criar uma extensão para StringBuilder com uma classe simples:
Depois, basta adicionar:
No início de qualquer classe em que você deseja usar o StringBuilder e sempre que usar o intelli-sense com uma variável StringBuilder, os métodos Prepend e PrependLine serão exibidos. Lembre-se de que, ao usar o Prepend, você precisará fazer o Prepend na ordem reversa do que se estivesse no Anexing.
fonte
Isso deve funcionar:
fonte
string
, mas não funciona com valores do tipoStringBuilder
. A resposta de @ScubaSteve funciona bem.