|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Senior Member
Iscritto dal: Jan 2006
Città: Perugia - San Benedetto del Tronto
Messaggi: 348
|
[JAVA]Problemi con la classe StringTokenizer
Salve.
Non sò se ricordate il progetto a cui stò lavorando per la tesi, ma è venuto fuori un altro problema legato alla classe StringTokenizer che ho utilizzato per la realizzazione di un piccolo parser per funzioni matematiche. All'interno del codice della mia classe Parser è presente questa riga per istanziare uno StringTokenizer: Codice:
str = new StringTokenizer(formula, "* - / + ( )", true); Quote:
2 * x / ( 1 + x ) E fin qui niente di strano. E' proprio quello che voglio. Il problema però nasce nel momento in cui voglio utilizzare un delimitatore non più di un solo carattere, ma di più caratteri (esempio: sin, cos, tan). Ho provato a ridefinire la mia istanza str in questo modo: Codice:
str = new StringTokenizer(formula, "* - / + ( ) sin", true); s i n ( x + 2 ) E non è quello che voglio, infatti avrei bisogno di un risultato del tipo: sin ( x + 2 ) Esiste un modo per ovviare a questo problema? Oppure a questo punto devo scrivermi un Tokenizer da me? |
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Beh, la soluzione per "tagliare la testa la toro" secondo me sarebbe quella di implementare a mano un analizzatore lessicale per espressioni matematiche, ad hoc.
E' più facile a farsi che a spiegarsi, qui c'è un esempio completo. Ora per quanto riguarda StringTokenizer, è doveroso sottolineare (visto che stai facendo una tesi magari ti può interessare, e forse già lo sai) che questa è una classe che è stata mantenuta nelle API per ragioni di retrocompatibilità e il suo uso è scoraggiato: chi vuole ottenere la stessa funzionalità è invitato a usare il metodo split di String, oppure il package java.util.regex. In pratica invitano ad usare le API basate sulle espressioni regolari. Poi solo una cosa, che temo di non aver afferrato. Se hai una espressione così: "15+4*sin(1.57)..." e semplicemente "sin" non lo usi come delimiter, ti dovrebbe venire restituito come token, no? ![]() Codice:
public class Parser { public static void main(String... args) { String delimiter = "+-*/()"; String expression="15+4*sin(1.57)"; StringTokenizer tokenizer = new StringTokenizer(expression, delimiter, true); while (tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken()); } } } // OUTPUT: 15 // token + // delimiter 4 // token * // delimiter sin // token ( // delimiter 1.57 // token ) // delimiter ...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Jan 2006
Città: Perugia - San Benedetto del Tronto
Messaggi: 348
|
Quote:
![]() Non sò come ho fatto a non pensarci. Grazie mille ![]() Quote:
Grazie ancora ![]() Ultima modifica di :.Blizzard.: : 17-11-2009 alle 14:31. |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:49.