Newsgroup: it.comp.java
Titolo: Opinioni su implementazione classe StringTokenizer

Cito dal sorgente StringTokenizer.java dal package Java SDK 1.4.1:
....
/**
 * maxDelimChar stores the value of the delimiter character with the
 * highest value. It is used to optimize the detection of delimiter
 * characters.
 */
 private char maxDelimChar;
/**
 * Set maxDelimChar to the highest char in the delimiter set.
 */
private void setMaxDelimChar() {
    if (delimiters == null) {
            maxDelimChar = 0;
            return;
    }
    char m = 0;
    for (int i = 0; i < delimiters.length(); i++) {
            char c = delimiters.charAt(i);
            if (m < c)
                m = c;
     }
     maxDelimChar = m;
}
....
    /**
     * Skips ahead from startPos and returns the index of the next delimiter
     * character encountered, or maxPosition if no such delimiter is found.
     */
    private int scanToken(int startPos) {
            int position = startPos;
            while (position < maxPosition) {
                    char c = str.charAt(position);
                    if ((c <= maxDelimChar) && (delimiters.indexOf(c) >= 0))
                        break;
                    position++;
             }
             if (retDelims && (startPos == position)) {
                    char c = str.charAt(position);
                    if ((c <= maxDelimChar) && (delimiters.indexOf(c) >= 0))
<---------- !!!!!!
                            position++;
             }
             return position;
     }
Mi sfugge il metodo con cui riesce a riconoscere il delimitatore (c <=
maxDelimChar).
Presuppone un tipo di sequenzialità tra i caratteri delimitatori?
Non posso utilizzare questo algoritmo se volessi come delimitatori delle
lettere?
----------------------------
Domenico Testa - Studente

 Domenico Testa - Studente
Cito dal doc api:
"Constuctor Detail
.......
.......
public StringTokenizer(String str,
                       String delim)
Constructs a string tokenizer for the specified string. The characters in 
the delim argument are the delimiters for separating tokens. Delimiter 
characters themselves will not be treated as tokens. 
Parameters:
str - a string to be parsed.
delim - the delimiters."
se il mio inglese non è andato completamente ruggine , direi che puoi usare 
il costruttore di StringTokenizer per scegliere il delimitatore che vuoi 
tu, se ho capito cosa chiedevi.
-- 
Ciao. Fabrizio.
icq: 241182067

 tu, se ho capito cosa chiedevi.
Io possi impostare una sequenza finita di delimitatori.
Voglio solo dei chiarimenti sul metodo utilizzato per capire come fa la
classe a capire se un dato carattere nella stringa da analizzare fa parte di
tale set. Dai sorgenti non ho ben capito.

 maxDelimChar).
Usa la codifica numerica dei caratteri di Java, che e' unicode. Per cui 
dire 'a'<'b' in italiano e' gergo per "il codice di 'a'" < "il codice di 
'b'", per il compilatore si tratta di eseguire una promozione - vedi la 
JLS.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 JLS.
Quindi vuol dire che non posso utilizzare questa classe per suddividere una
stringa in cui il delimitatore sia, ad esempio, il carattere 's'?
Il riconoscimento fallirebbe.
Tirando le somme, questa classe implementa un tokenizer molto veloce per
suddividere una stringa in token partendo dal presupposto che si vorranno
usare, come caratteri delimitatori, quei caratteri di controllo (forse
meglio spaziatura?) \n\f\t che, nella tabell UNICODE si trovano prima degli
altri caratteri.
Dico bene?

 Dico bene?
Uh? No. :)
Primo, il metodo e' privato, quindi non ti dovrebbe preoccupare. :)
Secondo, se proprio ci tieni a vedere com'e' usato, ti accorgi che
e' semplicemente invocato nel costruttore, e dipende dai delimitatori che 
passi in costruzione.
In altre parole, in costruzione passi i delimitatori che vuoi, e 
internamente StringTokenizer "ricorda" qual'e' il delimitatore di codice 
massimo tra quelli che hai passato, e usa quest'informazione per 
velocizzare la tokenizzazione.
Se passi ad esempio "acs" come delimitatori, 's' e' il carattere il cui 
codice e' massimo.


 velocizzare la tokenizzazione.
"Velocizzare la tokenizzazione" facendo un controllo sul massimo
(numericamente parlando) dei caratteri della stringa dei delimitatori. Come
funziona tale controllo? Questo non sono riuscito a capire.

 Come funziona tale controllo? Questo non sono riuscito a capire.
Non ci ho mai prestato attenzione, ma il codice che hai postato usa cose 
tipo:
if ((c <= maxDelimChar) && (delimiters.indexOf(c) >= 0))
perche' indexOf e' potenzialmente costosa (specie se i delimitatori sono 
parecchi) e quindi il programmatore la vuole eseguire solo se il (codice 
del) carattere sotto verifica non eccede il massimo (codice del) carattere 
delimitatore.
La semantica di && e' leggermente diversa in Java da C++, e fa si' che la 
r-expr non sia nemmeno valutata se la l-expr e' false.


 ha scritto nel messaggio
news:Xns932D950788440cr...@130.133.1.4...

Grazie.
L'importante è capirsi. ;-)