Estou procurando por um método comum comum ou operador que me permita repetir algumas String n vezes. Eu sei que poderia escrever isso usando um loop for, mas desejo evitar loops sempre que necessário e um método direto simples deve existir em algum lugar.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Relacionado a:
repetir string javascript Crie NSString repetindo outra string um determinado número de vezes
Editado
Eu tento evitar loops quando eles não são completamente necessários porque:
Eles aumentam o número de linhas de código, mesmo que estejam escondidas em outra função.
Alguém lendo meu código precisa descobrir o que estou fazendo nesse loop for. Mesmo que seja comentado e possua nomes significativos de variáveis, eles ainda precisam garantir que não esteja fazendo nada "inteligente".
Os programadores adoram colocar coisas inteligentes em loops, mesmo que eu escreva para "apenas fazer o que se pretende fazer", isso não impede que alguém apareça e adicione alguma "correção" inteligente.
Muitas vezes, é fácil errar. Para loops envolvendo índices tendem a gerar um erro.
Os loops geralmente reutilizam as mesmas variáveis, aumentando a chance de encontrar bugs de escopo realmente difíceis.
Para loops, aumente o número de lugares que um caçador de insetos precisa procurar.
Respostas:
String::repeat
Novo no Java 11 é o método
String::repeat
que faz exatamente o que você solicitou:Seu Javadoc diz:
fonte
"abc".repeat(3)
Aqui está a versão mais curta (é necessário o Java 1.5 ou superior):
Onde
n
é o número de vezes que você deseja repetir a sequência es
é a sequência a ser repetida.Não são necessárias importações ou bibliotecas.
fonte
char[]
neste caso) são instanciados com nulos, então aString
é criado a partir dechar[]
e os nulos estãoreplaced()
com o caractere em que você desejas
...replace('\0', str)
deve ser usado em vez da versão String.replace(char oldChar, char newChar)
ereplace(CharSequence target, CharSequence replacement)
então eu não vejo como isso poderia funcionarSe você estiver usando Java <= 7 , isso é tão "conciso" quanto possível:
No Java 8 e acima, há uma maneira mais legível:
Finalmente, para Java 11 e superior, existe um novo
repeat(int count)
método específico para isso ( link )Como alternativa, se o seu projeto usa bibliotecas java, há mais opções.
Para o Apache Commons :
Para o Google Guava :
fonte
n
é zero.s
tem que ser String, não umChar
Commons Lang StringUtils.repeat ()
Uso:
fonte
O Java 8
String.join
fornece uma maneira organizada de fazer isso em conjunto comCollections.nCopies
:fonte
Aqui está uma maneira de fazer isso usando apenas funções String padrão e sem loops explícitos:
fonte
replace()
. No Java 1.5+, há uma versão sobrecarregadareplace()
que leva doisCharSequence
s (incluindoString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/…n=3
: primeiro formata uma string para se parecer com algo%03d
(%%
é escapar do sinal de porcentagem), que é o código de formatação para adicionar 3 zeros de preenchimento, depois formata0
com isso, levando a000
, e finalmente substituindo cada um0
com as stringsSe você é como eu e quer usar o Google Guava e não o Apache Commons. Você pode usar o método repeat na classe Guava Strings.
fonte
Com java-8, você também pode usar
Stream.generate
.e você pode envolvê-lo em um método utilitário simples, se necessário:
fonte
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
que parallelizes melhorEntão você quer evitar loops?
Aqui você tem:
(é claro que sei que isso é feio e ineficiente, mas não possui loops :-p)
Você quer isso mais simples e mais bonito? use jython:
Edit : vamos otimizar um pouco :-D
Edit2 : Eu fiz um benchmark rápido e sujo para as 4 principais alternativas, mas não tenho tempo para executá-lo várias vezes para obter os meios e plotar os tempos para várias entradas ... Então, aqui está o código, se alguém quiser experimentá-lo:
São necessários dois argumentos, o primeiro é o número de iterações (cada função é executada com tempos de repetição arg de 1..n) e o segundo é a sequência a ser repetida.
Até agora, uma rápida inspeção dos tempos de execução com entradas diferentes deixa o ranking mais ou menos assim (melhor para pior):
Eu nunca imaginei que a função recursiva fosse mais rápida que o
for
loop: -oDivirta-se (xD ctional).
fonte
Este contém menos caracteres que a sua pergunta
fonte
commons-lang3.3.1-sources
e você não é mais tão bom;) Mas se alguém já tivercommons-lang
, eu apoio sua resposta.com base na resposta do fortran , esta é uma versão recusativa que usa um StringBuilder:
fonte
usar Dollar é simples como digitar:
PS: repeat também funciona para array, List, Set, etc
fonte
Eu queria uma função para criar uma lista delimitada por vírgula de pontos de interrogação para fins de JDBC e encontrei esta postagem. Então, eu decidi pegar duas variantes e ver qual tinha melhor desempenho. Após 1 milhão de iterações, o StringBuilder, da variedade de jardins, levou 2 segundos (fun1) e a versão supostamente mais ideal (fun2) levou 30 segundos. Qual o sentido de ser enigmático de novo?
fonte
Solução OOP
Quase todas as respostas propõem uma função estática como uma solução, mas pensando em Orientação a Objetos (para fins de reutilização e clareza), eu vim com uma Solução via Delegação através da Interface CharSequence (que também abre a usabilidade em Classes CharSequence mutáveis).
A classe a seguir pode ser usada com ou sem Separator-String / CharSequence e cada chamada para "toString ()" cria a String final repetida. O Input / Separator não se limita apenas à String-Class, mas pode ser toda classe que implementa CharSequence (por exemplo, StringBuilder, StringBuffer, etc)!
Código fonte:
Exemplo de uso:
Saída de exemplo:
fonte
usando apenas classes JRE ( System.arraycopy ) e tentando minimizar o número de objetos temporários, você pode escrever algo como:
EDITAR
e sem loops você pode tentar com:
EDIT 2
o uso de coleções é ainda mais curto:
no entanto, eu ainda gosto da primeira versão.
fonte
Não é o mais curto, mas (acho) a maneira mais rápida é usar o StringBuilder:
fonte
Se a sua preocupação é a velocidade, você deve usar o mínimo possível de cópias em memória. Portanto, é necessário trabalhar com matrizes de caracteres.
Para testar a velocidade, um método ideal semelhante usando o StirngBuilder é o seguinte:
e o código para testá-lo:
E aqui a execução resulta do meu sistema:
Observe que o teste para o loop é acionar o JIT e obter melhores resultados.
fonte
por questões de legibilidade e portabilidade:
fonte
Se você está preocupado com o desempenho, basta usar um StringBuilder dentro do loop e executar um .toString () na saída do loop. Caramba, escreva sua própria Util Class e reutilize-a. 5 linhas de código máx.
fonte
Eu realmente gosto dessa pergunta. Há muito conhecimento e estilos. Então eu não posso sair sem mostrar meu rock and roll;)
Você gosta disso?
fonte
fonte
Loop simples
fonte
times
para o construtor StringBuilder.Tente isto:
fonte
Usando recursão, você pode fazer o seguinte (usando operadores ternários, uma linha no máximo):
Eu sei, é feio e provavelmente não é eficiente, mas é uma linha!
fonte
uma solução simples de uma linha:
requer Java 8
fonte
Apesar do seu desejo de não usar loops, acho que você deve usar um loop.
Seus motivos para não usar um loop for não são bons. Em resposta às suas críticas:
fonte
repetitions = -5
. b) faça o download do Commons Lang e executerepeatString('a', 1000)
um milhão de vezes seguidas; faça o mesmo com o seu código; compare os tempos. Para crédito extra, faça o mesmo comrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Porque essa foi a minha resposta que você votou mal. Ele também tem um desempenho melhor e não possui bugs.Se você souber apenas o comprimento da sequência de saída (e ela pode não ser divisível pelo comprimento da sequência de entrada), use este método:
Demonstração de uso:
Não use com vazio
s
elength
> 0, pois é impossível obter o resultado desejado nesse caso.fonte
aqui está o último Stringutils.java StringUtils.java
ele nem precisa ser tão grande, pode ser transformado nisso e pode ser copiado e colado em uma classe de utilitário em seu projeto.
Então, e5, acho que a melhor maneira de fazer isso seria simplesmente usar o código mencionado acima, ou qualquer uma das respostas aqui. mas commons lang é muito grande se for um projeto pequeno
fonte
Eu criei um método recursivo que faz a mesma coisa que você quer .. fique à vontade para usar isso ...
Eu tenho a mesma resposta em Posso multiplicar seqüências de caracteres em java para repetir seqüências?
fonte
StringBuilder
vez disso.Você pode usar esse método recursivo para o objetivo desejado.
fonte