¿Cómo llego a los primeros n
caracteres de una cadena en Java sin hacer primero una verificación de tamaño (en línea es aceptable) o arriesgar un IndexOutOfBoundsException
?
¿Cómo llego a los primeros n
caracteres de una cadena en Java sin hacer primero una verificación de tamaño (en línea es aceptable) o arriesgar un IndexOutOfBoundsException
?
Respuestas:
Aquí hay una solución ordenada:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Opinión: si bien esta solución es "ordenada", creo que en realidad es menos legible que una solución que usa if
/ else
de la manera obvia. Si el lector no ha visto este truco, tiene que pensar más para entender el código. OMI, el significado del código es más obvio en la versión if
/ else
. Para una solución más limpia / más legible, vea la respuesta de @ paxdiablo.
No reinventes la rueda ...:
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Javadoc dice:
StringUtils.substring(null, *, *) = null StringUtils.substring("", * , *) = ""; StringUtils.substring("abc", 0, 2) = "ab" StringUtils.substring("abc", 2, 0) = "" StringUtils.substring("abc", 2, 4) = "c" StringUtils.substring("abc", 4, 6) = "" StringUtils.substring("abc", 2, 2) = "" StringUtils.substring("abc", -2, -1) = "b" StringUtils.substring("abc", -4, 2) = "ab"
Así:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
no es lo mismo que yourString.substring(0, n)
. El primero es de StringUtils
, mientras que el segundo está usando String.substring
(lo que da una excepción si el índice final excede la longitud de la cadena).
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
no es len, es el índice final.
Apache Commons Lang tiene un StringUtils.left
método para esto.
String upToNCharacters = StringUtils.left(s, n);
Hay una clase de pregunta sobre SO que a veces tiene menos sentido, esta está peligrosamente cerca :-)
Quizás podría explicar su aversión a usar uno de los dos métodos que descartó.
Si es solo porque no quiere sazonar su código con if
declaraciones o códigos de captura de excepciones, una solución es usar una función auxiliar que se encargará de usted, algo como:
static String substring_safe (String s, int start, int len) { ... }
que verificará las longitudes de antemano y actuará en consecuencia (ya sea devolver una cadena más pequeña o rellenar con espacios).
Entonces no tiene que preocuparse por eso en su código, simplemente llame:
String s2 = substring_safe (s, 10, 7);
en vez de:
String s2 = s.substring (10,7);
Esto funcionaría en el caso de que parezca estar preocupado (en base a sus comentarios a otras respuestas), no interrumpir el flujo del código al hacer muchas cosas de construcción de cadenas.
String upToNCharacters = String.format("%."+ n +"s", str);
Horrible si n
es una variable (por lo que debe construir la cadena de formato), pero bastante claro si es una constante:
String upToNCharacters = String.format("%.10s", str);
Utilice el método de subcadena, de la siguiente manera:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
Si n es mayor que la longitud de la cadena, esto generará una excepción, como ha señalado un comentarista. Una solución simple es envolver todo esto en la condición if(s.length()<n)
de su else
cláusula, puede elegir si solo desea imprimir / devolver toda la Cadena o manejarla de otra manera.
Si tienes la suerte de desarrollarte con Kotlin,
puedes usarlo take
para lograr tu objetivo.
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons me sorprendió,
StringUtils.abbreviate(String str, int maxWidth)
agrega "..." no hay opción para cambiar postfix.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
mira hacia el siguiente espacio vacío.
Solo voy a dejar esto aquí:
public static String abbreviate(String s, int maxLength, String appendToEnd) {
String result = s;
appendToEnd = appendToEnd == null ? "" : appendToEnd;
if (maxLength >= appendToEnd.length()) {
if (s.length()>maxLength) {
result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
}
} else {
throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
}
return result;
}