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
?
java
string
indexoutofboundsexception
antony.trupe
la source
la source
Réponses:
Voici une solution intéressante:
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 versionif
/else
. Pour une solution plus propre / plus lisible, voir la réponse de @ paxdiablo.la source
Ne réinventez pas la roue ...:
Javadoc dit:
Donc:
la source
StringUtils.substring(yourString, 0, n)
n'est pas la même chose queyourString.substring(0, n)
. Le premier est deStringUtils
, tandis que le second utiliseString.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.la source
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: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:
au lieu de:
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.
la source
Horrible si
n
est une variable (vous devez donc construire la chaîne de format), mais assez clair si une constante:docs
la source
Utilisez la méthode substring, comme suit:
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 votreelse
clause, vous pouvez choisir si vous voulez simplement imprimer / renvoyer la chaîne entière ou la gérer d'une autre manière.la source
Si vous avez la chance de développer avec Kotlin,
vous pouvez l'utiliser
take
pour atteindre votre objectif.la source
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:
la source
Kotlin: (Si quelqu'un a besoin)
la source