Mais precisamente: StringBuffer para jdk1.4 e abaixo, StringBuilder para jdk1.5 e posteriores, já que o último não está sincronizado, portanto, um pouco mais rápido.
VonC,
2
Em vez de duas invocações iter.hasNext (), geralmente acrescento delimeter e, em seguida, "return buf.substring (0, buf.length () - delimeter.length ())".
Vilmantas Baranauskas,
2
Você pode simplificá-lo um pouco saindo mais cedo para evitar o delimitador: while (true) (add_iter; if (! Iter.hasNext ()) break; add_delim;}
Quanto à adesão, acredito que isso possa parecer um pouco menos complicado:
publicStringjoin(Collection<String> c){StringBuilder sb=newStringBuilder();for(String s: c)
sb.append(s);return sb.toString();}
Não consigo usar a sintaxe Java 5 tanto quanto gostaria (acredite ou não, tenho usado 1.0.x ultimamente), então posso estar um pouco enferrujado, mas tenho certeza de que o conceito está correto .
adição de edição: acréscimos de string podem ser lentos, mas se você estiver trabalhando em código GUI ou alguma rotina de execução curta, realmente não importa se você leva 0,005 segundos ou 0,006, então se você tinha uma coleção chamada "joinMe" que você deseja anexar a uma string existente "target", não seria horrível apenas embutir isto:
for(String s : joinMe)
target += s;
É bastante ineficiente (e um mau hábito), mas não é nada que você seja capaz de perceber, a menos que haja milhares de strings ou que esteja dentro de um loop enorme ou que seu código seja realmente crítico para o desempenho.
Mais importante, é fácil de lembrar, curto, rápido e muito legível. O desempenho nem sempre é o vencedor automático nas escolhas de design.
O loop for está correto, mas você também deve torná-lo uma Coleção <String>. Caso contrário, você teria que dizer "for (Object o: c)", porque você não poderia garantir que tudo em c era uma String.
Michael Myers
Bom ponto, estou ainda mais enferrujado com os genéricos. Vou editá-lo em.
Bill K,
Ao concatear sequencialmente: string + string + string, o compilador usa StringBuilder para acrescentar os valores. Eu me pergunto se no método for-loop você tem o segundo lugar, se o compilador faria o mesmo.
Spencer Kormos,
@Spencer K: Ele usa um StringBuilder, mas cria um novo para cada iteração (dificilmente o método mais eficiente, mas como o compilador deveria saber?). Não sei se o compilador JIT pode otimizar isso em tempo de execução.
Michael Myers
2
Oh espere. Você está falando + =? Sim, isso é péssimo. O loop e append atualmente em minha resposta usa StringBuilder e é disso que estou falando. Embora + = tenha melhorado muito, você realmente não quer usá-lo dentro de um loop - não tanto que seja bugado, mas que pode funcionar como uma merda (Bug não é um termo geralmente usado para problemas de desempenho - pelo menos não em meus 20 anos de programação). Além disso, o JIT pode melhorar isso imensamente - mas eu não confiaria nisso.
Bill K
4
Aqui está uma resposta muito simples. Use +=uma vez que tem menos código e deixe o otimizador convertê-lo em um StringBuilderpara você. Usando esse método, você não precisa fazer nenhuma verificação "é a última" em seu loop (melhoria de desempenho) e não precisa se preocupar em remover quaisquer delimitadores no final.
Solução muito elegante, não envolvendo bibliotecas de terceiros!
Denis Itskovich
2
Eu não queria importar uma biblioteca Apache inteira para adicionar uma função de junção simples, então aqui está meu hack.
publicStringjoin(String delim,List<String> destinations){StringBuilder sb =newStringBuilder();int delimLength = delim.length();for(String s: destinations){
sb.append(s);
sb.append(delim);}// we have appended the delimiter to the end // in the previous for-loop. Let's now remove it.if(sb.length()>= delimLength){return sb.substring(0, sb.length()- delimLength);}else{return sb.toString();}}
@MrSnowflake O construtor de string padrão tem um método "removeCharAt (int index)" Não está aparecendo na versão que estou executando
NSjonas
@NSjonas - sim, a edição dele para minha resposta está errada. O removeCharAtnão existe e a função inteira não retorna mais uma String ... Corrigirá isso.
Martin Konecny
enquanto você está nisso ... esta solução atual lançará uma "exceção de índice fora dos limites se você passar em uma lista vazia"
NSjonas
fez uma edição para obter o comprimento correto do corte se o delim tiver mais de 1 caractere. Também foi corrigido um problema em que você estava cortando o último caractere e não o primeiro como realmente precisava
NSjonas
Obrigado pelo feedback. Atualizada.
Martin Konecny
1
Se você deseja unir (concatenar) várias strings em uma, você deve usar um StringBuilder. É muito melhor do que usar
for(String s : joinMe)
target += s;
Há também uma pequena vitória de desempenho sobre StringBuffer, já que StringBuilder não usa sincronização.
Para um método utilitário de propósito geral como este, ele (eventualmente) será chamado muitas vezes em muitas situações, portanto, você deve torná-lo eficiente e não alocar muitos objetos transitórios. Fizemos o perfil de muitos aplicativos Java diferentes e quase sempre descobrimos que a concatenação de string e as alocações de string / char [] ocupam uma quantidade significativa de tempo / memória.
Nossa coleção reutilizável -> método string primeiro calcula o tamanho do resultado necessário e, em seguida, cria um StringBuilder com esse tamanho inicial; isso evita duplicação / cópia desnecessária do char interno [] usado ao anexar strings.
re: pré-cálculo do tamanho: quando funciona, é ótimo. Nem sempre é possível. Lembro-me de ter lido em algum lugar que dobrar o tamanho do buffer a cada vez (ou realmente multiplicar por qualquer fator fixo) dá algo como n log n desempenho, o que não é realmente tão ruim. No caso geral, a alternativa é fazer uma lista de todas as strings que você planeja concatenar. Se você usar um ArrayList, terá de copiar novamente (a menos que você saiba o comprimento de sua sequência com antecedência) e se usar LinkedList, ele usa mais memória ram e coleta de lixo com os objetos de nó. Às vezes você não pode vencer. Tente!
Ian
Os exemplos / consultas acima presumiram alguma coleção ordenada ou matriz de Strings a serem unidas. Além disso, ao pré-calcular o tamanho, você evita caracteres extras não utilizados que o crescimento interno da matriz char [] geralmente resulta.
Vejo muitas implementações excessivamente complexas de String.Join aqui. Se você não tiver o Java 1.8 e não quiser importar uma nova biblioteca, a implementação abaixo deve ser suficiente.
publicStringjoin(Collection<String> col,String delim){StringBuilder sb =newStringBuilder();for(String s : col ){if( sb.length()!=0) sb.append(delim);
sb.append(s);}return sb.toString();}
Não tenho certeza de que parte da pergunta isso responde? Não é um String.format a menos que você planeje adicionar os bits da string bit a bit ao array, e [1,0.92,3] não é tão versátil quanto uma string genérica .join.
Omar Kooheji de
-8
Eu usaria apenas o operador de concatenação de string "+" para juntar duas strings. s1 += s2;
Respostas:
O objeto Java String tem um
format
método (a partir de 1.5), mas nenhumjoin
método.Para obter vários métodos de utilitário String úteis ainda não incluídos, você pode usar org.apache.commons.lang.StringUtils .
fonte
String.join()
método.String.format . Para participar, você precisa escrever o seu próprio:
O texto acima vem de http://snippets.dzone.com/posts/show/91
fonte
A goiaba vem com a
Joiner
aula .fonte
A partir do Java 8,
join()
agora está disponível como dois métodos de classe na classe String. Em ambos os casos, o primeiro argumento é o delimitador.Você pode passar
CharSequence
s individuais como argumentos adicionais :Ou você pode passar um
Iterable<? extends CharSequence>
:Java 8 também adiciona uma nova classe
StringJoiner
, que você pode usar assim:fonte
TextUtils.join está disponível no Android
fonte
Você também pode usar argumentos variáveis para strings da seguinte maneira:
fonte
Quanto à adesão, acredito que isso possa parecer um pouco menos complicado:
Não consigo usar a sintaxe Java 5 tanto quanto gostaria (acredite ou não, tenho usado 1.0.x ultimamente), então posso estar um pouco enferrujado, mas tenho certeza de que o conceito está correto .
adição de edição: acréscimos de string podem ser lentos, mas se você estiver trabalhando em código GUI ou alguma rotina de execução curta, realmente não importa se você leva 0,005 segundos ou 0,006, então se você tinha uma coleção chamada "joinMe" que você deseja anexar a uma string existente "target", não seria horrível apenas embutir isto:
É bastante ineficiente (e um mau hábito), mas não é nada que você seja capaz de perceber, a menos que haja milhares de strings ou que esteja dentro de um loop enorme ou que seu código seja realmente crítico para o desempenho.
Mais importante, é fácil de lembrar, curto, rápido e muito legível. O desempenho nem sempre é o vencedor automático nas escolhas de design.
fonte
Aqui está uma resposta muito simples. Use
+=
uma vez que tem menos código e deixe o otimizador convertê-lo em umStringBuilder
para você. Usando esse método, você não precisa fazer nenhuma verificação "é a última" em seu loop (melhoria de desempenho) e não precisa se preocupar em remover quaisquer delimitadores no final.fonte
Eu não queria importar uma biblioteca Apache inteira para adicionar uma função de junção simples, então aqui está meu hack.
fonte
removeCharAt
não existe e a função inteira não retorna mais uma String ... Corrigirá isso.Se você deseja unir (concatenar) várias strings em uma, você deve usar um StringBuilder. É muito melhor do que usar
Há também uma pequena vitória de desempenho sobre StringBuffer, já que StringBuilder não usa sincronização.
Para um método utilitário de propósito geral como este, ele (eventualmente) será chamado muitas vezes em muitas situações, portanto, você deve torná-lo eficiente e não alocar muitos objetos transitórios. Fizemos o perfil de muitos aplicativos Java diferentes e quase sempre descobrimos que a concatenação de string e as alocações de string / char [] ocupam uma quantidade significativa de tempo / memória.
Nossa coleção reutilizável -> método string primeiro calcula o tamanho do resultado necessário e, em seguida, cria um StringBuilder com esse tamanho inicial; isso evita duplicação / cópia desnecessária do char interno [] usado ao anexar strings.
fonte
Eu escrevi:
mas
Collection
não é compatível com JSP, portanto, para a função de tag, escrevi:e
.tld
arquivado:e usá-lo em arquivos JSP como:
fonte
StringUtils é uma classe muito útil na biblioteca Apache Commons Lang.
fonte
Existe o
MessageFormat.format()
que funciona como o C #String.Format()
.fonte
Vejo muitas implementações excessivamente complexas de String.Join aqui. Se você não tiver o Java 1.8 e não quiser importar uma nova biblioteca, a implementação abaixo deve ser suficiente.
fonte
Então, basicamente, o String ntop armazena o valor de toda a coleção com separadores de vírgula e colchetes.
fonte
Eu usaria apenas o operador de concatenação de string "+" para juntar duas strings.
s1 += s2;
fonte