Existe uma maneira no java de criar uma string com um número especificado de um caractere especificado? No meu caso, eu precisaria criar uma string com 10 espaços. Meu código atual é:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Existe uma maneira melhor de realizar a mesma coisa. Em particular, eu gostaria de algo rápido (em termos de execução).
java
string
stringbuffer
Cruz
fonte
fonte
append(' ')
em vez ... que envolve um pouco menos de computação ...Respostas:
O loop for será otimizado pelo compilador. Nesses casos, como o seu, você não precisa se preocupar com a otimização por conta própria. Confie no compilador.
BTW, se houver uma maneira de criar uma string com n caracteres de espaço, ela será codificada da mesma maneira que você criou.
fonte
static Dictionary<int, String>
?" ".substring(0, 10);
Provavelmente o código mais curto usando a
String
API, exclusivamente:Como método, sem instanciar diretamente
char
:Invoque usando:
fonte
Hmm agora que penso nisso, talvez
Arrays.fill
:Obviamente, suponho que o
fill
método faça a mesma coisa que o seu código, portanto provavelmente terá o mesmo desempenho, mas pelo menos isso é menos linhas.fonte
Arrays.fill()
função for usada consistentemente para fazer esse trabalho em todo o seu código e código de biblioteca (padrão e externo), será um bom candidato para a compilação de Hotspot e terá uma chance maior de ser encontrado no cache da CPU. As JVMs futuras podem atribuí-lo como uma função intrínseca . Rolar seus próprios corta fora de toda essa bondade desempenho ...Eu sugiro não escrever o loop manualmente. Você fará isso repetidamente durante o curso de sua carreira em programação. As pessoas que leem seu código - que inclui você - sempre precisam investir tempo, mesmo que sejam apenas alguns segundos, para digerir o significado do loop.
Em vez disso, reutilize uma das bibliotecas disponíveis, fornecendo código que é exatamente igual
StringUtils.repeat
ao Apache Commons Lang :Dessa forma, você também não precisa se preocupar com desempenho, portanto, todos os detalhes sangrentos de
StringBuilder
otimizações do compilador etc. ficam ocultos. Se a função fosse lenta, seria um erro da biblioteca.Com o Java 11 , fica ainda mais fácil:
fonte
No Java 8, você pode usar
String.join
:fonte
Se você deseja apenas espaços, que tal:
o que resultará em abs (n) espaços;
fonte
desde o Java 11 :
desde o Java 8 :
Onde:
fonte
Desde o Java 11, você pode simplesmente usar
String.repeat(count)
para resolver seu problema.Então, em vez de um loop, seu código ficaria assim:
fonte
Eu acho que esse é o menor código possível, ele usa a classe Guava Joiner:
fonte
pubic String n(int n) { ... }
que permitirá código "menos":n(10)
mas, novamente, não faz sentido.Você pode usar a
String.format
função padrão para gerar N espaços. Por exemplo:Faz uma string com 5 espaços.
ou
Faz uma sequência de 15 barras de espaço.
Se você deseja que outro símbolo se repita, substitua espaços pelo símbolo desejado:
Resultado:
fonte
Minha contribuição é baseada no algoritmo para exponenciação rápida.
Testei o algoritmo contra duas outras abordagens:
String.concat()
para concatenar stringStringBuilder
Código de teste (concatenação usando um loop for e
String.concat()
fica muito lenton
, então deixei de fora após a 5ª iteração).Resultados:
Conclusão:
n
- use a abordagem recursivan
- o loop for tem velocidade suficientefonte
if
declarações vão atrapalhar a previsão de ramificação da CPU. Isso realmente deve ser refeito usando JMH ( openjdk.java.net/projects/code-tools/jmh ), caso contrário, é um pouco inútil.Que tal agora?
fonte
Considerando que temos:
Java 8 (usando fluxo)
Java 8 (usando nCopies)
fonte
Collectors.joining(EMPTY_STRING)
é equivalente aCollectors.joining()
RandomStringUtils tem uma provisão para criar uma string a partir de um determinado tamanho de entrada. Não posso comentar sobre a velocidade, mas é um forro.
cria uma saída
preferível se você não quiser ver \ 0 no seu código.
fonte
Use StringUtils: StringUtils.repeat ('', 10)
fonte
Na maioria dos casos, você só precisa de Strings até um determinado comprimento, digamos 100 espaços. Você pode preparar uma matriz de Strings em que o número do índice seja igual ao tamanho da string preenchida com espaço e procurar a string, se o comprimento necessário estiver dentro dos limites ou criá-lo sob demanda, se estiver fora do limite.
fonte
A solução mais curta com o Goiaba:
Via Maneira simples de repetir uma String em java .
fonte
Apenas substitua seu StringBuffer por um StringBuilder . Difícil de superar isso.
Se o seu comprimento for um número grande, você poderá implementar um anexo automático mais eficiente (mas mais desajeitado), duplicando o comprimento em cada iteração:
Além disso, você pode tentar a
Arrays.fill()
abordagem ( resposta do FrustratedWithFormsDesigner ).fonte
Você pode substituir
StringBuffer
porStringBuilder
(o último não está sincronizado, pode ser mais rápido em um aplicativo de thread único)E você pode criar a
StringBuilder
instância uma vez, em vez de criá-la sempre que precisar.Algo assim:
E use-o assim:
Se você mantiver sua
createA
variável de instância, poderá economizar tempo criando instâncias.Isso não é seguro para threads, se você tiver vários threads, cada thread deverá ter sua própria cópia.
fonte
Para obter um bom desempenho, combine as respostas do aznilamir e do FrustratedWithFormsDesigner
Ajuste o tamanho de
BLANKS
acordo com suas necessidades. MinhaBLANKS
string específica tem cerca de 200 caracteres.fonte
Tenha um método como este. Isso acrescenta espaços necessários no final do dado
String
para dar um dadoString
ao comprimento de comprimento específico.fonte
Deseja que a String seja de tamanho fixo, para que você forme ou trunque, para tabular dados ...
Excelente referência aqui .
fonte
Isso funcionou para mim sem usar nenhuma biblioteca externa no Java 8
E a saída é
fonte
int c = 10; Espaços de string = String.format ("%" + c + "c", ''); Isto irá resolver o seu problema.
fonte
Um método simples como abaixo também pode ser usado
fonte
que tal agora?
Edição: Eu escrevi um código simples para testar o conceito e aqui o que eu encontrei.
Método 1: adicionando espaço único em um loop:
Método 2: anexar 100 espaços e loop e, em seguida, substring:
O resultado que obtive criando 12.345.678 espaços:
e para 10.000.000 de espaços:
combinar alocação direta e iteração sempre leva menos tempo, em média 60ms menos ao criar grandes espaços. Para tamanhos menores, ambos os resultados são insignificantes.
Mas, por favor, continue a comentar :-)
fonte
Não conheço nenhum método interno para o que você está perguntando. No entanto, para um pequeno comprimento fixo como 10, seu método deve ser bastante rápido.
fonte