Existe uma maneira de determinar se o loop está repetindo pela última vez. Meu código é algo como isto:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
Agora, o problema é que não quero acrescentar a vírgula na última iteração. Agora existe uma maneira de determinar se é a última iteração ou estou preso ao loop for ou usando um contador externo para acompanhar.
java
for-loop
foreach
conditional-execution
Mercury
fonte
fonte
Respostas:
Outra alternativa é acrescentar a vírgula antes de acrescentar i, mas não na primeira iteração. (Por favor, não use
"" + i
, a propósito - você realmente não quer concatenação aqui, e o StringBuilder tem uma sobrecarga de acréscimo (int) perfeitamente boa.)O bom disso é que ele funcionará com qualquer um
Iterable
- nem sempre é possível indexar as coisas. ("Adicione a vírgula e remova-a no final" é uma boa sugestão quando você está realmente usando o StringBuilder - mas não funciona para coisas como escrever em fluxos. É possivelmente a melhor abordagem para esse problema exato. )fonte
isFirst
sinalizador booleano. Bônus: mais rápido também.Outra maneira de fazer isso:
Atualização: para Java 8, agora você tem Coletores
fonte
Pode ser mais fácil anexar sempre. E então, quando você terminar seu loop, remova o caractere final. Toneladas menos condicionais dessa maneira também.
Você pode usar
StringBuilder
'sdeleteCharAt(int index)
com índice sendolength() - 1
fonte
Talvez você esteja usando a ferramenta errada para o trabalho.
Isso é mais manual do que você está fazendo, mas é, de certa forma, mais elegante, se não um pouco "antiquado"
fonte
Isso é quase uma repetição desta pergunta do StackOverflow . O que você deseja é StringUtils e chame o método join .
fonte
Outra solução (talvez a mais eficiente)
fonte
mantenha-o simples e use um padrão para loop:
ou apenas use apache commons-lang StringUtils.join ()
fonte
Os loops explícitos sempre funcionam melhor do que os implícitos.
Você deve agrupar tudo em uma declaração if, caso esteja lidando com uma matriz de comprimento zero.
fonte
Se você o converter em um loop de índice clássico, sim.
Ou você pode simplesmente excluir a última vírgula depois que terminar. Igual a:
Eu, eu apenas uso
StringUtils.join()
do commons-lang .fonte
Você precisa de um separador de classes .
A implementação da classe
Separator
é direta. Ele agrupa uma sequência retornada em todas as chamadas,toString()
exceto a primeira, que retorna uma sequência vazia.fonte
Com base em java.util.AbstractCollection.toString (), sai cedo para evitar o delimitador.
É eficiente e elegante, mas não tão evidente quanto algumas das outras respostas.
fonte
(! i.hasNext())
, que é uma parte importante da robustez da abordagem geral. (As outras soluções aqui lidar com coleções vazias graciosamente, então o seu deve também :)!Aqui está uma solução:
Procure a primeira iteração :)
fonte
Como o kit de ferramentas mencionado, no Java 8, agora temos coletores . Aqui está a aparência do código:
Eu acho que faz exatamente o que você está procurando, e é um padrão que você pode usar para muitas outras coisas.
fonte
Mais uma opção.
fonte
Muitas das soluções descritas aqui são um pouco exageradas, IMHO, especialmente aquelas que dependem de bibliotecas externas. Existe um bom idioma limpo e claro para obter uma lista separada por vírgulas que eu sempre usei. Ele se baseia no operador condicional (?):
Editar : Solução original correta, mas não ideal de acordo com os comentários. Tentando uma segunda vez:
Lá está você, em 4 linhas de código, incluindo a declaração da matriz e o StringBuilder.
fonte
Aqui está uma referência do SSCCE que eu executei (relacionada ao que eu tinha que implementar) com estes resultados:
No meu exemplo, pelo menos, pular a verificação a cada iteração não é visivelmente mais rápido, especialmente para volumes sãos de dados, mas é mais rápido.
fonte
Outra abordagem é manter o comprimento da matriz (se disponível) armazenado em uma variável separada (mais eficiente do que verificar novamente o comprimento toda vez). Em seguida, você pode comparar seu índice com esse comprimento para determinar se deseja adicionar ou não a vírgula final.
EDIT: Outra consideração é ponderar o custo de desempenho da remoção de um caractere final (que pode causar uma cópia de cadeia) contra a verificação condicional de cada iteração.
fonte
Se você estiver transformando apenas uma matriz em uma matriz delimitada por vírgula, muitos idiomas terão uma função de junção exatamente para isso. Transforma uma matriz em uma string com um delimitador entre cada elemento.
fonte
Nesse caso, não há realmente necessidade de saber se é a última repetição. Existem muitas maneiras de resolver isso. Uma maneira seria:
fonte
Dois caminhos alternativos aqui:
1: Utilitários de String do Apache Commons
2: mantenha um booleano chamado
first
, definido como true. Em cada iteração, sefirst
for falso, anexe sua vírgula; depois disso, definafirst
como false.fonte
Como é uma matriz fixa, seria mais fácil simplesmente evitar o aprimorado para ... Se o Object for uma coleção, um iterador seria mais fácil.
fonte