¿Hay alguna manera de determinar si el ciclo está iterando por última vez? Mi código se parece a esto:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
Ahora la cosa es que no quiero agregar la coma en la última iteración. Ahora hay una manera de determinar si es la última iteración o si estoy atascado con el bucle for o usando un contador externo para realizar un seguimiento.
java
for-loop
foreach
conditional-execution
Mercurioso
fuente
fuente
Respuestas:
Otra alternativa es agregar la coma antes de agregar i, pero no en la primera iteración. (Por
"" + i
cierto, no lo use , por cierto, realmente no desea la concatenación aquí, y StringBuilder tiene una sobrecarga append (int) perfectamente buena).Lo bueno de esto es que funcionará con cualquiera
Iterable
: no siempre puede indexar las cosas. (El "agregar la coma y luego eliminarlo al final" es una buena sugerencia cuando realmente está utilizando StringBuilder, pero no funciona para cosas como escribir en secuencias. Sin embargo, es posiblemente el mejor enfoque para este problema exacto. )fuente
isFirst
bandera booleana. Bono: más rápido también.Otra forma de hacer esto:
Actualización: para Java 8, ahora tiene recopiladores
fuente
Puede ser más fácil agregar siempre. Y luego, cuando haya terminado con su ciclo, simplemente elimine el carácter final. Toneladas menos condicionales de esa manera también.
Puedes usar
StringBuilder
'sdeleteCharAt(int index)
con index siendolength() - 1
fuente
Tal vez está utilizando la herramienta incorrecta para el trabajo.
Esto es más manual que lo que estás haciendo, pero es de una manera más elegante, si no un poco "vieja escuela"
fuente
Esto es casi una repetición de esta pregunta de StackOverflow . Lo que quieres es StringUtils y llamar al método de unión .
fuente
Otra solución (quizás la más eficiente)
fuente
manténgalo simple y use un estándar para loop:
o simplemente use apache commons-lang StringUtils.join ()
fuente
Los bucles explícitos siempre funcionan mejor que los implícitos.
Debería envolver todo en una declaración if solo en caso de que esté tratando con una matriz de longitud cero.
fuente
Si lo convierte en un bucle de índice clásico, sí.
O simplemente puede eliminar la última coma después de que esté hecha. Al igual que:
Yo, solo lo uso
StringUtils.join()
de commons-lang .fuente
Necesita un separador de clase .
La implementación de la clase
Separator
es sencilla. Envuelve una cadena que se devuelve en cada llamada,toString()
excepto en la primera llamada, que devuelve una cadena vacía.fuente
Basado en java.util.AbstractCollection.toString (), sale temprano para evitar el delimitador.
Es eficiente y elegante, pero no tan evidente como algunas de las otras respuestas.
fuente
(! i.hasNext())
, que es una parte importante de la solidez del enfoque general. (Las otras soluciones aquí manejar colecciones vacías con gracia, por lo que la suya deben también :)!Aquí hay una solución:
Busque la primera iteración :)
fuente
Como se mencionó en el kit de herramientas, en Java 8 ahora tenemos recopiladores . Así es como se vería el código:
Creo que eso hace exactamente lo que estás buscando, y es un patrón que puedes usar para muchas otras cosas.
fuente
Otra opción más.
fuente
Muchas de las soluciones descritas aquí son un poco exageradas, en mi humilde opinión, especialmente aquellas que dependen de bibliotecas externas. Hay un buen lenguaje limpio y claro para lograr una lista separada por comas que siempre he usado. Se basa en el operador condicional (?):
Editar : Solución original correcta, pero no óptima según los comentarios. Intentando por segunda vez:
Ahí tienes, en 4 líneas de código, incluida la declaración de la matriz y el StringBuilder.
fuente
Aquí hay un punto de referencia SSCCE que ejecuté (relacionado con lo que tuve que implementar) con estos resultados:
Al menos en mi ejemplo, omitir el control en cada iteración no es notablemente más rápido, especialmente para volúmenes de datos sanos, pero es más rápido.
fuente
Otro enfoque es tener la longitud de la matriz (si está disponible) almacenada en una variable separada (más eficiente que volver a verificar la longitud cada vez). Luego puede comparar su índice con esa longitud para determinar si agregar o no la coma final.
EDITAR: Otra consideración es sopesar el costo de rendimiento de eliminar un carácter final (que puede causar una copia de cadena) en contra de que se verifique un condicional en cada iteración.
fuente
Si solo está convirtiendo una matriz en una matriz delimitada por comas, muchos idiomas tienen una función de unión para exactamente esto. Convierte una matriz en una cadena con un delimitador entre cada elemento.
fuente
En este caso, realmente no hay necesidad de saber si es la última repetición. Hay muchas formas en que podemos resolver esto. Una forma sería:
fuente
Dos caminos alternativos aquí:
1: Utilidades de cadena de Apache Commons
2: Mantenga un booleano llamado
first
, establecido en verdadero. En cada iteración, sifirst
es falsa, agregue su coma; después de eso, establecerfirst
en falso.fuente
Dado que es una matriz fija, sería más fácil simplemente evitar la mejora para ... Si el Objeto es una colección, un iterador sería más fácil.
fuente