185 votes

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

Comment puis-je accéder au premier n d'une chaîne de caractères en Java sans effectuer un contrôle de la taille au préalable (en ligne est acceptable) ou sans risquer un échec de l'opération. IndexOutOfBoundsException ?

1 votes

À moins que vous ne capturiez l'exception, je ne sais pas comment vous comptez gérer le cas où la longueur du caractère est supérieure à la longueur de la chaîne.

2 votes

Pourquoi ? Quelle est votre aversion pour la vérification de la longueur ou la capture d'une exception ?

1 votes

Par curiosité, pourquoi voulez-vous éviter le contrôle de la taille ? Ce n'est pas du C.

385voto

Stephen C Points 255558

Voici une solution astucieuse :

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 la manière la plus évidente. Si le lecteur n'a pas vu cette astuce, il doit réfléchir davantage pour comprendre le code. IMO, la signification du code est plus évidente dans les if / else version. Pour une solution plus propre / plus lisible, voir la réponse de @paxdiablo.

1 votes

+1. Encore mieux si cela est enveloppé dans une fonction nommée safe_substring ou substring_safe, comme la réponse de paxdiablo, de sorte que l'utilisation est plus facile à lire / l'intention plus évidente.

1 votes

Je ne suis pas d'accord avec ce que vous dites. Si c'est enveloppé dans une fonction, Peu importe ce qui se trouve à l'intérieur de la fonction. et le manque de clarté l'emporte nettement sur la "propreté". L'intérêt de cette solution est qu'elle est "soignée" pour le cas où l'on Ne le fais pas. vous voulez créer une fonction d'encapsulation.

0 votes

Il serait plus judicieux d'utiliser StringUtils. Cela permet d'éviter les exceptions IndexOutOfBoundsException et NullPointerException.

100voto

Nickkk Points 81

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"

1 votes

Il ne répond pas à la question, mais il fournit quand même la solution. Si le PO est capable de comprendre, je pense que c'est une meilleure solution.

6 votes

Il pourrait également être utile de souligner que 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 (qui donne une exception si l'index de fin dépasse la longueur de la chaîne).

0 votes

Pour information, si vous regardez dans la source de cette méthode, elle gère le cas où l'extrémité est supérieure à la longueur en remplaçant l'extrémité par la longueur : if (end > str.length()) { end = str.length();}

14voto

13ren Points 3672
String upToNCharacters = String.format("%."+ n +"s", str);

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

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

docs

0 votes

Une alternative intéressante, même si je ne peux pas m'imaginer l'utiliser un jour, étant donné les approches plus traditionnelles, qui ont été données il y a quatre ans.

0 votes

Meilleure réponse parce que la chaîne de caractères en entrée n'est lue qu'une seule fois, il n'est donc pas nécessaire de la stocker dans une variable, ce qui permet de l'intégrer proprement.

11voto

paxdiablo Points 341644

Il y a une catégorie de questions sur le SO qui ne sont pas toujours parfaitement sensées, celle-ci en est dangereusement proche :-)

Peut-être pourriez-vous expliquer votre aversion à utiliser l'une des deux méthodes que vous avez écartées.

Si c'est juste parce que vous ne voulez pas saupoudrer votre code de if ou du code de capture d'exception, une solution consiste à utiliser une fonction d'aide 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 (soit en retournant une chaîne plus petite, soit en la remplissant d'espaces).

Vous n'avez donc pas à vous en soucier dans votre code, il suffit d'appeler :

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

au lieu de :

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

Cela fonctionnerait dans le cas qui semble vous préoccuper (d'après vos commentaires sur d'autres réponses), à savoir ne pas rompre le flux du code lorsque l'on fait beaucoup de constructions de chaînes.

2 votes

+1 : C'est une bien meilleure approche que celle acceptée, étant donné le désir du PO de ne pas encombrer le code. (ou voir la solution de Nickkk d'inclure une bibliothèque qui a déjà une fonction qui se comporte comme souhaité).

2voto

Matt Boehm Points 1162

Utilisez la méthode des sous-chaînes, 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, une exception sera levée, comme l'a fait remarquer un commentateur. Une solution simple consiste à intégrer tout cela dans la condition suivante if(s.length()<n) en su else vous pouvez choisir d'imprimer/renvoyer la chaîne entière ou de la traiter d'une autre manière.

1 votes

Cela risque d'obtenir une IndexOutOfBoundsException

0 votes

À propos, si vous envisagez de programmer en Java, vous devriez essayer de mémoriser la plupart des méthodes de l'API pour String ( java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html ).

0 votes

J'ai déjà exclu la sous-chaîne, du moins par elle-même, car no la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X