Comment obtenir les premiers n
caractères d'une chaîne en Java sans faire d'abord une vérification de la taille (en ligne est acceptable) ou risquer un IndexOutOfBoundsException
?
Comment obtenir les premiers n
caractères d'une chaîne en Java sans faire d'abord une vérification de la taille (en ligne est acceptable) ou risquer un IndexOutOfBoundsException
?
Réponses:
Voici une solution intéressante:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Opinion: si cette solution est "soignée", je pense qu'elle est en fait moins lisible qu'une solution qui utilise if
/ else
de manière évidente. Si le lecteur n'a pas vu cette astuce, il doit réfléchir plus fort pour comprendre le code. IMO, la signification du code est plus évidente dans la version if
/ else
. Pour une solution plus propre / plus lisible, voir la réponse de @ paxdiablo.
Ne réinventez pas 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"
Donc:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
n'est pas la même chose que yourString.substring(0, n)
. Le premier est de StringUtils
, tandis que le second utilise String.substring
(ce qui donne une exception si l'index de fin dépasse la longueur de la chaîne).
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
n'est pas len, c'est l'index de fin.
Apache Commons Lang a une StringUtils.left
méthode pour cela.
String upToNCharacters = StringUtils.left(s, n);
Il y a une classe de questions sur SO qui n'a parfois pas de sens, celle-ci est dangereusement proche :-)
Peut-être pourriez-vous expliquer votre aversion à l’utilisation de l’une des deux méthodes que vous avez exclues.
Si c'est simplement parce que vous ne voulez pas poivrer votre code avec des if
instructions ou du code de capture d'exceptions, une solution consiste à utiliser une fonction d'assistance qui s'en chargera pour vous, quelque chose comme:
static String substring_safe (String s, int start, int len) { ... }
qui vérifiera les longueurs au préalable et agira en conséquence (retourne une chaîne plus petite ou un pad avec des espaces).
Ensuite, vous n'avez pas du tout à vous en soucier dans votre code, appelez simplement:
String s2 = substring_safe (s, 10, 7);
au lieu de:
String s2 = s.substring (10,7);
Cela fonctionnerait dans le cas où vous semblez être inquiet (en fonction de vos commentaires sur d'autres réponses), ne pas briser le flux du code lorsque vous faites beaucoup de choses de construction de chaînes.
String upToNCharacters = String.format("%."+ n +"s", str);
Horrible 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);
Utilisez la méthode substring, 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, cela lèvera une exception, comme l'a souligné un commentateur. une solution simple consiste à envelopper tout cela dans la condition if(s.length()<n)
de votre else
clause, vous pouvez choisir si vous voulez simplement imprimer / renvoyer la chaîne entière ou la gérer d'une autre manière.
Si vous avez la chance de développer avec Kotlin,
vous pouvez l'utiliser take
pour atteindre votre objectif.
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons m'a surpris,
StringUtils.abbreviate(String str, int maxWidth)
ajoute "..." il n'y a pas d'option pour changer le suffixe.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
regarde le prochain espace vide.
Je vais juste laisser ceci 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;
}