PDA

View Full Version : [Java]un problema nel confronto


m.distrutti
15-09-2007, 20:48
Salve a tutti,questo mio problema lo sto affrontando da diverse ore :

ho creato un semplice algoritmo divide et impera per contare le ricorrenze d un particolare elemento(senza usare i generics percio in questo caso e' una stringa)
all'interno di un array

la funzione rikorsiva e' questa :

public int countTargetDivideEtImpera(String[] vect,int i,int j){
int c = 0;
int middle;
if(i == j){
if (vect[i] == "aba")
c = 1;
else
c = 0;
return c;
}else{
middle = (i + j)/2;
return countTargetDivideEtImpera(vect,i,middle) + countTargetDivideEtImpera(vect,middle + 1,j);
}

}


il codice mi conta tranquillamente tutte le ricorrenze della stringa aba all'interno dell'array passato e fin qui funziona....dopo un po ho deciso d fare in modo ke la stringa ricercata venga scelta dall'utente con una acquisizione da tastiera e fin qui mi e' sembrata una cosa banale,basta aggiungere un parametro alla funzione e cambiare la stringa "aba" in una variabile :

public int countTargetDivideEtImpera(String[] vect,int i,int j,String target){
int c = 0;
int middle;
if(i == j){
if (vect[i] == target)
c = 1;
else
c = 0;
return c;
}else{
middle = (i + j)/2;
return countTargetDivideEtImpera(vect,i,middle,target) + countTargetDivideEtImpera(vect,middle + 1,j,target);
}
}

ecco qui sorge il problema....pure debuggando il programma al confronto:
vect[i] == target
un determinato elemento di vect kon indice i risulta essere uguale a target >_> ma nn va nel ramo true dell' if,va nell'else e ritorna 0

spero che qualk1 mi sia di aiuto e ringrazio in anticipo ^^'

vegeta83ssj
15-09-2007, 20:55
Prova:

if(vect[i].equals(target))

in questo modo usi il metodo apposito della classe String per fare il confronto.

Ciauz

m.distrutti
15-09-2007, 21:06
Prova:

if(vect[i].equals(target))

in questo modo usi il metodo apposito della classe String per fare il confronto.

Ciauz

grandissimo grazie adesso mi va^_^

pero nn ho capito perke' ora si e prima no :(

alla fine vect[i].equals(target) nn e' uguale a scrivere vect[i] == target?
io pensavo di si

cmq grazia mille^_^:D :D :D :D

The3DProgrammer
15-09-2007, 21:20
è assolutamente diverso. L'utilizzo dell'operatore == su oggetti porta al confronto degli indirizzi. Prima ti funzionava perchè, presumibilmente, hai inizializzato il vettore con vect[k]="aba". Queste costanti note a compile time vengono memorizzate una sola volta nel constant pool.


ciao

m.distrutti
16-09-2007, 02:20
no ma l'array che passo alla procedura nn e' inizializzato costante

cmq ho fatto prima delle prove e risulta false se la stringa la acquisisco da tastiera [ premettendo ke uso un oggetto scanner e il metodo nextline ]

per esempio :
String ciao = "ciao";
vect[i] == ciao //e' true supponendo ke in vect[i] ci sia la stringa ciao

e
String ciao = null;
Scanner keyboard = new Scanner(System.in);
ciao = keyboard.nextLine();
vect[i] == ciao
// mi torna false anke se inserisco ciao da tastiera supponendo sempre ke in
vect[i] c sia la stringa ciao

credo sia per l'enter finale ke viene inserito nella stringa a sto punto bho(anke se provando il confronto dopo l'acquisizione: ciao == "ciao\n" mi torna false ankora,percio escluderei pure l'enter digitato dall'utente per acquisire la stringa)

purtroppo nn ho ankora molta dimestikezza kol java e nn conosco bene il linguaggio per fare le giuste prove

The3DProgrammer
16-09-2007, 12:34
Scrivere


String ciao = "ciao";
vect[k]=ciao;



oppure


vect[k]="ciao";


porta allo stesso risultato in termini di indirizzi di memoria.

se vuoi che nn ti funzioni, prova

String ciao = new String("ciao");
vect[k]=ciao;


Ti ripeto, il confronto con == su oggetti confronta gli indirizzi, e visto che la stringa "ciao" viene allocata una sola volta nel constant pool, ovunque utilizzerai la costante "ciao" avrai sempre lo stesso indirizzo, e == darà esito positivo.




ciao

pisto
16-09-2007, 15:37
per dirla in breve == controlla se sono la stessa stringa, equals(Object) controlla se le stringhe hanno lo stesso testo. È diverso.

kome mai scrivi tutto con la k???????

m.distrutti
17-09-2007, 11:37
scusate ma a sto punto la variabile ciao e vect[i] sono oggetti stringa diversi ma con lo stesso testo ,perche' mi torna true se hanno due indirizzi diversi essendo due oggetti stringa separati?

PS:scusate se scrivo con la k ma anni e anni d chat e sms cazzuti mi hanno plagiato XD[sono un giovane universitario ghghgh :D]

Mixmar
17-09-2007, 14:32
scusate ma a sto punto la variabile ciao e vect[i] sono oggetti stringa diversi ma con lo stesso testo ,perche' mi torna true se hanno due indirizzi diversi essendo due oggetti stringa separati?

Non conta il fatto che siano "separati": ogni volta che tu usi la costante stringa "ciao" nel tuo programma, crei in realtà una nuova stringa con new String("ciao"): ma siccome questa operazione è onerosa, Java le esegue una volta sola, e così tutti stanno puntando alla stessa istanza di stringa, contenente "ciao".

Per questo il confronto funziona: se tu però ESPLICITAMENTE allochi una nuova stringa con new String("ciao"), Java crea un nuovo oggetto in memoria, praticamente identico all'altro, creato automaticamente come ho detto sopra, salvo che per il riferimento, che è diverso. Quindi "==", che confronta proprio i riferimenti, non funzionerà.

khamel
17-09-2007, 14:57
Alla fine basta che ti tieni in mente questa cosa:

se controlli uguaglianza di tipi primitivi(int, boolean ecc.) allora usi sempre ==
se controlli uguaglianza di oggetti usi sempre .equals

Ciao

m.distrutti
18-09-2007, 00:30
ok vi ringrazio ora ho capito bene :P