PDA

View Full Version : [JAVA] Tipo di variabile


petitof
17-06-2004, 12:24
come faccio a capire il tipo di variabile...nel senso ho un array di parametri di vario tipo........
il mio problema è che devo controllare di che tipo sono (ci sono date, interi , lon.....ecc)?!!!


:muro:

thefrog
17-06-2004, 13:11
Originariamente inviato da petitof
come faccio a capire il tipo di variabile...nel senso ho un array di parametri di vario tipo........
il mio problema è che devo controllare di che tipo sono (ci sono date, interi , lon.....ecc)?!!!


:muro:

un array ha specificato in se stesso il tipo di oggetti che contiene...

a meno che non sia un'array di Object :what:

cn73
17-06-2004, 15:01
Starà parlando di un Vector, un po' di fantasia ;)
object.getClass().getName()
se invece ti serve a runtime testare il tipo di un oggetto puoi usare l'operatore instanceof

if(object instanceof ....)

else if (object instanceof ....) ....

leomagic
17-06-2004, 15:22
prenditi il dato è vedi quanto spazio occupa in memoria!

petitof
17-06-2004, 15:51
io aho un array

String parametri[];


poi eseguo lo split di alcuni parametri di una query sql stringa...Es: ..25,'ciao',2900000 ...

in modo tale da avere

parametri [0] = 25
parametri [1] = 'ciao'
parametri [2] = 2900000


non so come fare...

Ed_Bunker
17-06-2004, 16:57
Originariamente inviato da petitof
io aho un array

String parametri[];


poi eseguo lo split di alcuni parametri di una query sql stringa...Es: ..25,'ciao',2900000 ...

in modo tale da avere

parametri [0] = 25
parametri [1] = 'ciao'
parametri [2] = 2900000


non so come fare...

Perche' non usi un Vector (Anziche' l'array) ed inserisci oggetti?
Potresti cosi' inserire:
String, Integer o qualsiasi nuovo TDA da te appositamente creato, in modo da poter, di volta in volta, riconoscere il tipo dell'oggetto contenuto nel Vector facendo un semplice instanceof ?!?

cn73
17-06-2004, 17:56
Senza stare a incasinarti se il tuo scopo è quello di distinguere se una stringa è un numero usa il metodo


try
{

int numero = Integer.parseInt(tuaStringa);

}
catch (NumberFormatException e)
{
....//se sei qui non è un numero...
}

Ed_Bunker
17-06-2004, 20:34
Originariamente inviato da cn73
Senza stare a incasinarti se il tuo scopo è quello di distinguere se una stringa è un numero usa il metodo


try
{

int numero = Integer.parseInt(tuaStringa);

}
catch (NumberFormatException e)
{
....//se sei qui non è un numero...
}


Gestione eccezione incontrollata...

cn73
18-06-2004, 09:40
ehhh? :confused:

PGI
19-06-2004, 01:39
Caro cn, altro che un po' di fantasia, qui ci vorrebbero gli aruspici (gente che leggeva il futuro nelle evoluzioni dei volatili).

ED_bunker è lapidario con la "gestione delle eccezioni non controllate". Suppongo lo segnali come pessimo stile ("bad practice" direbbero gli assuefatti all'oltremanica), ma non lo è.

Per due ragioni. Primo, perchè il fatto che taluni eventi siano segnati come eccezioni che possono anche non essere intercettate non significa che non debbano (o possano) mai esserlo. Secondo, perchè dell'eccezione cn usa un "effetto" (il trasferimento del controllo di esecuzione al blocco catch), schivando il fatto che le eccezioni dovrebbero segnalare solo eventi catastrofali: quest'ultima è per altro una linea guida più che una regola, a volte la si può ignorare, sempre nel caso in cui il codice ne risulti estremamente più sempice.

Il problema è che in questo caso il codice non salta fuori più semplice.

parseInt genera un'eccezione NumberFormatException anche nel caso in cui la stringa rappresenti un numero decimale o sovrabbondante per il formato intero a 32 bit. Il blocco try - catch dovrebbe quindi diventare una serie di try - catch annidati (dal piccolo al grande, per due volte).


int
long
float
double


"se po' fa'" ma forse viene fuori un mostriciattolo.

Torniamo a petitof che, dopo aver fatto "split di alcuni parametri di una query sql stringa" si ritrova con un array di oggetti String.

Quello che serve è un oggetto che sia in grado di determinare, data una stringa "s", se il testo in esso contenuto sia convertibile in un valore valido per la costruzione di un oggetto di tipo

Integer
Long
Double
Date
Float
[...altro]

conviene usare i contenitori per i primitivi perchè, come sottolinea Ed_Bunker, puoi infilarli tutti quanti in un'unica lista. Potresti anche usare un array di Object (mi sembra che tu conosca a priori le dimensioni che dovrebbe avere), ma le liste sono enormemente più flessibili (e nel caso di liste basate su array, come ArrayList, di poco meno rapide).

Come fare è interessante. La puoi pigliare in mille modi, se ho azzeccato la questione ci si può fare un pensierino. L'accendiamo?

Ciao.

Ed_Bunker
19-06-2004, 11:50
Originariamente inviato da PGI
Caro cn, altro che un po' di fantasia, qui ci vorrebbero gli aruspici (gente che leggeva il futuro nelle evoluzioni dei volatili).

ED_bunker è lapidario con la "gestione delle eccezioni non controllate". Suppongo lo segnali come pessimo stile ("bad practice" direbbero gli assuefatti all'oltremanica), ma non lo è.

Per due ragioni. Primo, perchè il fatto che taluni eventi siano segnati come eccezioni che possono anche non essere intercettate non significa che non debbano (o possano) mai esserlo. Secondo, perchè dell'eccezione cn usa un "effetto" (il trasferimento del controllo di esecuzione al blocco catch), schivando il fatto che le eccezioni dovrebbero segnalare solo eventi catastrofali: quest'ultima è per altro una linea guida più che una regola, a volte la si può ignorare, sempre nel caso in cui il codice ne risulti estremamente più sempice.

Il problema è che in questo caso il codice non salta fuori più semplice.

parseInt genera un'eccezione NumberFormatException anche nel caso in cui la stringa rappresenti un numero decimale o sovrabbondante per il formato intero a 32 bit. Il blocco try - catch dovrebbe quindi diventare una serie di try - catch annidati (dal piccolo al grande, per due volte).


int
long
float
double


"se po' fa'" ma forse viene fuori un mostriciattolo.

Torniamo a petitof che, dopo aver fatto "split di alcuni parametri di una query sql stringa" si ritrova con un array di oggetti String.

Quello che serve è un oggetto che sia in grado di determinare, data una stringa "s", se il testo in esso contenuto sia convertibile in un valore valido per la costruzione di un oggetto di tipo

Integer
Long
Double
Date
Float
[...altro]

conviene usare i contenitori per i primitivi perchè, come sottolinea Ed_Bunker, puoi infilarli tutti quanti in un'unica lista. Potresti anche usare un array di Object (mi sembra che tu conosca a priori le dimensioni che dovrebbe avere), ma le liste sono enormemente più flessibili (e nel caso di liste basate su array, come ArrayList, di poco meno rapide).

Come fare è interessante. La puoi pigliare in mille modi, se ho azzeccato la questione ci si può fare un pensierino. L'accendiamo?

Ciao.

Non penso che sia "pessimo stile" ma, in questo caso, il catturare e gestire esplicitamente una NumberFormatException non risolve per nulla le cose visto che, nel caso un NFE venga catturata, saprei soltanto di non avere a che fare con un numero intero (Poiche' per i decimali...) senza pero' capire cosa sia realmente l' "oggetto" (Una data ?! Altro ?!). Pertanto le cose si complicherebbero ulteriormente. Utilizzando invece una struttura che contenga oggetti (Un array di Object, un Vector o una List, come da te suggerito) (Sui quali fare il casting, dopo un controllo che individui il tipo effettivo del dato in questione) le cose si semplificano e appaiono molto piu' "pulite".

Ciao.

cn73
21-06-2004, 11:18
Il suo problema è distingere numeri da altro. Se questo è il suo problema la soluzione prenetata è ottimale. Se non ha solo degli Integer, può usare ad esempio i metodi della classe Long o Double.