web-dev-qa-db-fra.com

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

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?

147
antony.trupe

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.

330
Stephen C

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"
78
Nickkk

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

_String upToNCharacters = StringUtils.left(s, n);
_
31
Skuli

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.

12
paxdiablo
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);

docs

11
13ren

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.

3
Matt Boehm

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" )))
0
Leo Droidcoder