Qual é a maneira mais clara de delimitar uma lista por vírgulas em Java?
Eu conheço várias maneiras de fazer isso, mas estou me perguntando qual é a melhor maneira (onde "melhor" significa mais claro e / ou mais curto, não o mais eficiente.
Tenho uma lista e quero fazer um loop, imprimindo cada valor. Quero imprimir uma vírgula entre cada item, mas não depois do último (nem antes do primeiro).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Solução de amostra 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Solução de amostra 2 - crie uma sublista:
if (list.size()>0) {
System.out.print(list.get(0)); // no comma
List theRest = list.subList(1, list.size());
for (Item i : theRest) {
System.out.print(", "+i); // comma
}
}
Solução de amostra 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Eles tratam o primeiro item de maneira especial; em vez disso, pode-se tratar o último especialmente.
Aliás, aqui está como List
toString
é implementado (é herdado de AbstractCollection
), em Java 1.6:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Ele sai do loop mais cedo para evitar a vírgula após o último item. BTW: esta é a primeira vez que me lembro de ter visto "(esta coleção)"; aqui está o código para provocá-lo:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Congratulo-me com qualquer solução, mesmo que use bibliotecas inesperadas (regexp?); e também soluções em outras linguagens que não Java (por exemplo, eu acho que Python / Ruby tem uma função intercalar - como isso é implementado?).
Esclarecimento : por bibliotecas, quero dizer as bibliotecas Java padrão. Para outras bibliotecas, considero-as com outras linguagens, e tenho interesse em saber como estão implementadas.
O kit de ferramentas EDIT mencionou uma questão semelhante: Última iteração do loop for aprimorado em java
E outro: o último elemento em um loop merece um tratamento separado?
fonte
Respostas:
Java 8 e posterior
Usando a
StringJoiner
classe:Usando
Stream
, eCollectors
:Java 7 e anterior
Veja também # 285523
fonte
fonte
Java 8 oferece várias novas maneiras de fazer isso:
join
método ativadoString
.joining
colecionador de streams daCollectors
classe.StringJoiner
classe.Exemplo:
A abordagem usando fluxos assume
import static java.util.stream.Collectors.joining;
.fonte
Marceneiro .
fonte
Se você usar o Spring Framework, poderá fazê-lo com StringUtils :
fonte
Com base na implementação List toString do Java:
Ele usa uma gramática como esta:
Por ser baseado no último em vez de no primeiro, ele pode verificar a vírgula de salto com o mesmo teste para verificar o fim da lista. Eu acho que este é muito elegante, mas não tenho certeza sobre clareza.
fonte
fonte
Há uma maneira bonita de fazer isso usando Java 8:
fonte
fonte
Uma opção para o loop foreach é:
fonte
Atualização : Como Dave Webb mencionou nos comentários, isso pode não produzir resultados corretos se os primeiros itens da lista forem strings vazias.
fonte
Eu normalmente faço isso:
Embora eu ache que vou fazer essa verificação de agora em diante de acordo com a implementação Java;)
fonte
Se você pode usar Groovy (que é executado no JVM):
fonte
(Copie e cole minha própria resposta daqui .) Muitas das soluções descritas aqui são um pouco exageradas, IMHO, especialmente aquelas que dependem de bibliotecas externas. Há um idioma limpo e claro para obter uma lista separada por vírgulas que sempre usei. Ele depende do operador condicional (?):
Editar : solução original correta, mas não ideal de acordo com os comentários. Tentando uma segunda vez:
Aí está, em 4 linhas de código, incluindo a declaração da matriz e o StringBuilder.
2ª Edição : Se você estiver lidando com um Iterador:
fonte
Eu costumo usar algo parecido com a versão 3. Funciona bem c / c ++ / bash / ...: P
fonte
Não o compilei ... mas deve funcionar (ou estar perto de funcionar).
fonte
Isso é muito curto, muito claro, mas dá à minha sensibilidade os horrores arrepiantes. Também é um pouco estranho se adaptar a diferentes delimitadores, especialmente se for uma String (não char).
Inspirado por: Última iteração do loop for aprimorado em java
fonte
fonte
Item1Item2, Item3, Item4,
Gosto um pouco dessa abordagem, que encontrei em um blog há algum tempo. Infelizmente não me lembro do nome / URL do blog.
Você pode criar uma classe de utilitário / auxiliar semelhante a esta:
Usar a classe auxiliar é simples assim:
fonte
Como seu delimitador é "," você pode usar qualquer um dos seguintes:
Se o seu delimitador for QUALQUER OUTRA coisa, isso não vai funcionar para você.
fonte
Gosto desta solução:
Suponho que também possa usar StringBuilder.
fonte
Na minha opinião, este é o mais simples de ler e entender:
fonte
Em Python é fácil
",". junte-se (sua lista)
Em C #, há um método estático na classe String
String.Join (",", sua lista de strings)
Desculpe, não tenho certeza sobre o Java, mas achei melhor falar quando você perguntou sobre outras linguagens. Tenho certeza de que haveria algo semelhante em Java.
fonte
Você também pode adicionar incondicionalmente a string delimitadora e, após o loop, remover o delimitador extra no final. Então, um "se a lista está vazia, então retorne esta string" no início permitirá que você evite a verificação no final (já que você não pode remover caracteres de uma lista vazia)
Portanto, a questão realmente é:
"Dados um loop e um if, qual você acha que é a maneira mais clara de tê-los juntos?"
fonte
fonte
listToString.substring(0, listToString.length()-separator.length());
Com base na maneira mais clara de delimitar uma lista por vírgulas (Java)?
Usando esta ideia: O último elemento em um loop merece um tratamento separado?
fonte
for (int i=0; i<1; i++)
paraif (array.length>0)
.fonte
Nenhuma das respostas usa recursão até agora ...
fonte
fonte
Método
Uso
Dada a matriz de [1,2,3]
fonte