Bonjour,
Je voudrais savoir s'il est possible de mettre en place un StringTokenizer avec plusieurs délimiteurs ?
Merci
Version imprimable
Bonjour,
Je voudrais savoir s'il est possible de mettre en place un StringTokenizer avec plusieurs délimiteurs ?
Merci
Ca dépend comment tu veux l'utiliser et si tu travailles sur des schémas fixes.
En utilisant la méthode
tu appelle le prochain token avec le nouveau délimiteur spécifié, donc ca peut etre ta solution.Code:nextToken(String delim)
Je ne travaille pas avec des schémas fixes. Il existe plusieurs délimiteurs dans ma chaîne de caractères. C'est pour cela que j'aurais voulu si possible utiliser StringTokenizer avec en paramètres une liste de delimiteurs qui contiendrait tous mes délimiteurs.
Pourquoi ne pas utiliser les RegEx (java.util.regex.Pattern) ?
Tu dois pouvoir créer une expression régulière qui correspond à tes délimiteurs et ensuite il y a la méthode Pattern.split() qui te récupère directement les textes entre les délimiteurs.
StringTokenizer est deprecated ... Lui préférer String.split(regex)
En 1.6 c'est deprecated (ca me semble important à préciser vu que y'a encore des gens qui sont en 1.42 ^^)Citation:
Envoyé par chtig
Oui, exact, c'est deprecated en 1.6. Mais bon, tant qu'à écrire un code maintenant, autant éviter les choses qui sont deprecated même si c'est dans une version ultérieure. split existe quand même depuis 1.4 si je ne m'abuse ...Citation:
Envoyé par eulbobo
Même dans la 1.4.2 on peut lire dans la javadoc de StringTokenizer :
D'ailleurs je vois pas de deprecated sur cette classe dans Java 6 8OCitation:
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
Moi non plus, pas de déprecated.
Pour répondre à ta question sur plusieurs délimiteurs, ce que tu peux faire c'est tout d'abord définir une priorité sur ces opérateurs (par exemple +* => on sépare d'abord sur les +, puis sur les *).
Ensuite tu crée un StringTokenizer tk1 avec +.
Et tu analyse chaque tokens de tk1 avec un StringTokenizer tk2 avec les *.
Et tu peux recommencer autant de fois que tu veux ;-)
Y a ca... et sinon si jamais ce n'est pas trop la reponse a la question posee (qui n'est guere precise dans sa formulation initiale), il y a tout simplement le fait que de base tu peux passer plusieurs delimiteurs dans le constructeur :
Chacun des caracteres passes dans le second argument sera traite comme une separateur a part entiere. La chaine sera donc splitee suivant ' ' OU '\t' OU ',' OU ';' OU ':' OU '\n' OU '\r' soit l'equivalent d'un split sur "(' '|'\t'|','|';'|':'|'\n'|'\r')" si je ne m'abuse.Code:StringTokenizer tokenizer = new StringTokenizer(s, " \t,;:\n\r");
Cette classe a beau avoir ete remplacee par les regexp (et non pas mise en deprecated) elle n'en reste pas moins pratique pour des operation simples.
Effectivement, ce n'est pas deprecated.Citation:
Envoyé par bouye
En même temps, deprecated pour moi veut exactement dire
...Citation:
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code
Non, deprecated signifie que l'api est obsolète, et cela peut advenir pour plusieurs raisons :
- une api de substitution ou plus stable a été dévelopée (par exemple Date => Calendar, Vector => ArrayList<E> méthodes renommées pour standardisation)
- cette api n'était pas séurisée (Thread.stop() )
- ...
Par ailleurs, une api est deprecated est annotée par le tag @deprecated, on le voit explicitement dans la doc, et à l'utilisation le compilateur lache un warning n'empêchant bien évidement pas le programme de s'exécuter.
En même temps, sun ne met pas beaucoup de classes deprecated alors qu'elles le mériteraient (Vector est un exemple flagrant).
Sans doute pour éviter à ceux qui n'utilisent que ça d'avoir plein de warnings, et le code barré dans l'éditeur...
Le deprecated est surtout utilisé sur les méthodes...
La folie de la POO lol, un peu comme remplacer une méthode move ou translate par setLocation et déclarer la première deprectated, ça ne sert absolument à rin si ce n'est à répondre à un standart de programmation et d'architecture de code...
Benc'est le cas la avec split ...Citation:
une api de substitution ou plus stable a été dévelopée
Après, oui le compilo ne met pas de warning parce que ça n'est pas flaggué deprecated par Sun, mais dans l'idée en ce qui me concerne ça ne change rien ...
Citation:
Envoyé par bouye
Je trouve le split() beaucoup plus simple que le StringTokenizer...Citation:
Envoyé par bouye
Les méthodes de la classe StringTokenizer offrent quand même plus de possibilités que la méthode split.
Oui enfin bon, nextDelim, countTokens ou hasMoreTokens, c'est limité...Citation:
Envoyé par Razgriz
à la rigueur il y a le nextToken(delim), mais dans ce cas il y a la classe Scanner qui est beaucoup plus riche...
Cette discussion prend des airs de débat et ce n'est pas déplaisant. (C'est grâce à mon post que l'on en débat:P ) Ceci dit, je voudrais savoir si l'un de vous sait s'il est possible de surcharger la méthode StringTokeniser afin qu'elle prenne pour paramètre un tableau de String.
Cela m'éviterai d'avoir à passer par Regex.
En vous remerçiant,
Bonne journée.