Comment puis-je obtenir les n premiers caractères d'une chaîne sans vérifier la taille ou sortir des limites?

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

Question

Comment puis-je me lève aux premiers caractères n d'une chaîne en Java sans faire une vérification de la taille d'abord (en ligne est acceptable) ou risquer un IndexOutOfBoundsException?

Était-ce utile?

La solution

Voici une solution propre:

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

Avis: alors que cette solution est "propre", je pense qu'il est en fait moins lisible d'une solution qui utilise if / else de manière évidente. Si le lecteur n'a pas vu cette astuce, il / elle doit pense plus difficile pour comprendre le code. OMI, le sens du code est plus évident dans la version if / else. Pour une solution plus propre / plus lisible, voir @ réponse de paxdiablo.

Autres conseils

Ne pas réinventer la roue ...:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)

Javadoc dit:

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"

Ainsi:

StringUtils.substring("abc", 0, 4) = "abc"

Apache Commons Lang a méthode StringUtils.left pour cela.

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

Il y a une classe de question sur le SO que, parfois, faire moins de son sens, celui-ci est dangereusement proche: -)

Peut-être pourriez-vous expliquer votre aversion à l'utilisation de l'une des deux méthodes infirmée.

Si c'est juste parce que vous ne voulez pas agrémenteront votre code avec des instructions if ou exception du code de capture, une solution consiste à utiliser une fonction d'assistance qui prendra soin de lui pour vous, quelque chose comme:

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

qui vérifie les longueurs d'avance et agir en conséquence (soit retourner plus petite chaîne ou d'un tampon avec des espaces).

Ensuite, vous n'avez pas à vous soucier dans votre code du tout, il suffit d'appeler:

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

au lieu de:

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

Ceci fonctionnerait dans le cas où vous semblez être inquiet au sujet (en fonction de vos commentaires à d'autres réponses), ne pas casser le flux du code lorsque vous faites beaucoup de choses de la construction de la chaîne.

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

Awful si n est une variable (vous devez donc construire la chaîne de format), mais assez clair si une constante:

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

docs

A l'aide de la méthode de sous-chaîne, comme suit:

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

Si n est supérieur à la longueur de la chaîne, ce qui lancera une exception, comme un intervenant a souligné. Une solution simple consiste à envelopper tout cela dans la if(s.length()<n) condition dans votre clause else, vous pouvez choisir si vous voulez imprimer / retourner toute la chaîne ou le manipuler d'une autre manière.

Si vous êtes assez chanceux pour se développer avec Kotlin,
vous pouvez utiliser take pour atteindre votre objectif.

val someString = "hello"

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

me surpris Apache Commons, StringUtils.abbreviate(String str, int maxWidth) ajoute « ... » il n'y a pas possibilité de changer Postfix. WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) regarde à côté espace vide.

Je vais quitter ce ici:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top