¿Cómo consigo los primeros n caracteres de una cadena sin comprobar el tamaño o salir de los límites?

StackOverflow https://stackoverflow.com/questions/1583940

Pregunta

¿Cómo llego hasta los primeros caracteres n de una cadena en Java sin hacer una comprobación del tamaño primero (en línea es aceptable) o correr el riesgo de una IndexOutOfBoundsException?

¿Fue útil?

Solución

Aquí hay una solución clara y simple:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

Opinión: si bien esta solución es "limpio", creo que es en realidad menos legible que una solución que utiliza if / else de la manera obvia. Si el lector no ha visto este truco, él / ella tiene que pensar más para entender el código. La OMI, el significado del código es más evidente en la versión if / else. Para una solución más limpia / más fácil de leer, ver la respuesta de @ paxdiablo.

Otros consejos

No reinventar 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"

Apache Commons Lang tiene un StringUtils.left método para esto.

String upToNCharacters = StringUtils.left(s, n);

Hay una clase de pregunta en tanto que a veces ganan menos que perfecto sentido, éste es peligrosamente cerca: -)

Tal vez podría explicar su aversión a la utilización de uno de los dos métodos que se descartó.

Si es sólo porque usted no desea la pimienta con su código de declaraciones if o código de captura de excepción, una solución consiste en utilizar una función de ayuda que se hará cargo de él para usted, algo como:

static String substring_safe (String s, int start, int len) { ... }

que comprobará longitudes de antemano y actuar en consecuencia (ya sea de regreso cadena más pequeña o una almohadilla con espacios).

A continuación, usted no tiene que preocuparse por ello en su código en absoluto, simplemente llame a:

String s2 = substring_safe (s, 10, 7);

en lugar de:

String s2 = s.substring (10,7);

Esto funcionaría en el caso de que usted parece estar preocupado (sobre la base de sus comentarios a otras respuestas), no romper el flujo del código cuando se hace un montón de cosas edificio cadena.

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 una constante:

String upToNCharacters = String.format("%.10s", str);

docs

Usar el método subcadena, como sigue:

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 va a lanzar una excepción, ya que tiene un comentarista a cabo en punta. Una solución sencilla es envolver todo esto en la condición if(s.length()<n) en su cláusula else, puede elegir si lo que desea es imprimir / devolver toda la cadena o manipular de otra manera.

Si tienes la suerte de desarrollar con Kotlin, España puede utilizar take para lograr su objetivo.

val someString = "hello"

someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))

Apache Commons me sorprendió, StringUtils.abbreviate(String str, int maxWidth) anexa "..." no hay ninguna opción al cambio de sufijo. WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) mira hacia arriba al siguiente espacio vacío.

Yo sólo 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top