Comment accéder aux premiers n
caractères d'une chaîne dans Java sans vérifier d'abord la taille (inline est acceptable) ou risquer un IndexOutOfBoundsException
?
Voici une solution soignée:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Opinion: Bien que cette solution soit "soignée", je pense qu’elle est en réalité moins lisible qu’une solution qui utilise if
/else
de manière évidente. Si le lecteur n'a pas vu cette astuce, il doit penser plus fort pour comprendre le code. OMI, la signification du code est plus évidente dans la version if
/else
. Pour une solution plus propre et 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"
Ainsi:
StringUtils.substring("abc", 0, 4) = "abc"
Apache Commons Lang a une méthode StringUtils.left
pour cela.
_String upToNCharacters = StringUtils.left(s, n);
_
Il y a une classe de questions sur SO qui n'a parfois aucun sens, celle-ci est dangereusement proche :-)
Peut-être pourriez-vous expliquer votre aversion pour l’utilisation de l’une des deux méthodes que vous avez exclues.
Si c'est simplement parce que vous ne voulez pas ajouter du code dans votre code avec des instructions if
ou un code de capture d'exception, une solution consiste à utiliser une fonction d'assistance qui s'en chargera pour vous, comme par exemple:
static String substring_safe (String s, int start, int len) { ... }
qui vérifiera les longueurs à l’avance et agira en conséquence (retourne une chaîne plus petite ou un pad avec des espaces).
Dans ce cas, vous n'avez pas à vous soucier de cela 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 vous inquiéter (basé sur vos commentaires à d'autres réponses), ne pas interrompre le flux du code lorsque vous faites beaucoup de choses de construction de chaîne.
String upToNCharacters = String.format("%."+ n +"s", str);
Awful si n
est une variable (vous devez donc construire la chaîne de formatage), mais assez clair si une constante:
String upToNCharacters = String.format("%.10s", str);
Utilisez 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, cela jettera une exception, comme un intervenant l’a souligné. une solution simple consiste à envelopper tout cela dans la condition if(s.length()<n)
de votre clause else
, vous pouvez choisir si vous souhaitez simplement imprimer/retourner la chaîne entière ou la manipuler autrement.
Si vous avez la chance de 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" )))