PDA

View Full Version : [JAVA]Problema confronto stringa con valore


xxdavide84xx
20-01-2008, 12:28
Io ho questa classe:

class Body
{
String stile;

String jc;

String rstile;

String grassetto;

String italico;

String sottolineato;

String size;

String testo;

String titolopict;

String formatopict;

public String toString()
{
StringBuffer buffer = new StringBuffer();
if ( stile != null )
buffer.append("Stile body: " + stile + "\n");
if ( jc != null )
buffer.append(" Jc body: " + jc + "\n");
if ( rstile != null )
buffer.append(" Rstile body " + rstile + "\n");
if ( grassetto != null )
buffer.append(" Grassetto body " + grassetto + "\n");
if ( italico != null )
buffer.append(" Italico body " + italico + "\n");
if ( sottolineato != null )
buffer.append(" Sottolineato body: " + sottolineato + "\n");
if ( size != null )
buffer.append(" Dimensione body: " + size + "\n");
if ( testo != null )
buffer.append(" Testo body: " + testo + "\n");
if ( titolopict != null )
buffer.append(" Nome immagine body: " + titolopict + "\n");
if ( formatopict != null )
buffer.append(" Formato immagine body: " + formatopict + "\n");
return buffer.toString();
}
}

io facendo System.out.println(body.size) so che ha valore 24

se però provo a fare if(body.size=="24") il compilatore non entra nell'if, come mai???

riesco a farlo entrare solo se ho body.size con valore null facendo if(body.size==null)

carter100
20-01-2008, 12:53
Leva le "", devi confrontare 2 interi

xxdavide84xx
20-01-2008, 12:59
Leva le "", devi confrontare 2 interi
Se le levo l'ERRORE è questo:
C:\Documents and Settings\Utente\Desktop\DAVIDE V\Dom\bb.java:308: incomparable types: java.lang.String and int
if (body.size==24)
^

perchè body.size è una stringa e 24 un intero....

isAlreadyInUse
20-01-2008, 13:03
body.size().equals("24")

xxdavide84xx
20-01-2008, 13:28
body.size().equals("24")


così non funziona per via ()...

anche facendo body.seize.equals("24") che dovrebbe essere corretto sintatticamente infatti il programma non da errori..
però quando vado a campilare mi da il segente errore java.lang.NullPointerException

^TiGeRShArK^
20-01-2008, 13:36
così non funziona per via ()...

anche facendo body.seize.equals("24") che dovrebbe essere corretto sintatticamente infatti il programma non da errori..
però quando vado a campilare mi da il segente errore java.lang.NullPointerException

Per conforntare due stringhe devi usare necessariamente il metodo equals o equalsIgnoreCase in caso di serva un confronto non case-sensitive.
Se confronti due stringhe con l'operatore == in realtà stai confrontando il reference dei due oggetti stringa e ovviamente l'indirizzo della variabile body.size è diverso da quello della variabile creata implicitamente che ha come valore "24".
Il metodo corretto è quindi body.size.equals("24").
Se ti lancia una nullpointer allora molto probabilmente in quel momento la variabile size dell'oggetto body non è inizializzata, oppure l'intero oggetto body ha valore null.
Quindi controlla il tuo programma perchè sicuramente hai un errore di logica che si presenta al run-time oltre all'errore concettuale del confronto fra stringhe.

xxdavide84xx
20-01-2008, 13:41
Per conforntare due stringhe devi usare necessariamente il metodo equals o equalsIgnoreCase in caso di serva un confronto non case-sensitive.
Se confronti due stringhe con l'operatore == in realtà stai confrontando il reference dei due oggetti stringa e ovviamente l'indirizzo della variabile body.size è diverso da quello della variabile creata implicitamente che ha come valore "24".
Il metodo corretto è quindi body.size.equals("24").
Se ti lancia una nullpointer allora molto probabilmente in quel momento la variabile size dell'oggetto body non è inizializzata, oppure l'intero oggetto body ha valore null.
Quindi controlla il tuo programma perchè sicuramente hai un errore di logica che si presenta al run-time oltre all'errore concettuale del confronto fra stringhe.

Giusto mi hai fatto venire in mente una cosa....io ho anche dei valori nulli in mezzo quindi prima devo fare
if (body.size!=null)
poi dentro ci metto l'equlas e funziona....
GRAZIE!!!

Una curiosità quando uso equalsIgnoreCase se io faccio
if(body.testo.equalsIgnoreCase("indice")) lui mi trova indifferentemente Indice INDICE e indice, giusto???
if(body.testo.equalsIgnoreCase("Indice")) se io facessi così sarebbe la stessa cosa vero??? ossia mi trova quei 3 casi...

banryu79
20-01-2008, 18:34
Una curiosità quando uso equalsIgnoreCase se io faccio
if(body.testo.equalsIgnoreCase("indice")) lui mi trova indifferentemente Indice INDICE e indice, giusto???
if(body.testo.equalsIgnoreCase("Indice")) se io facessi così sarebbe la stessa cosa vero??? ossia mi trova quei 3 casi...

Quei tre casi e molti altri... anche "iNdICe" oppure "indicE" o "inDIcE" ecc...

xxdavide84xx
21-01-2008, 00:05
Grazie, questo ho risolto alla grande, ma ora mi si è posto un'altro piccolo problema con le Stringhe...

Se invece avessi una cosa del genere:
Class Style
{
String name;
String based;
String size;
}

ed ho poi da una parte questo....

if(size==null)
{
if (style.based !=null)
{
String a= style.based; (in una certa posizione)
for ( int j = 0; j < styleObjects.size() ;j++)
{
if(a.equals(style.name);
}
}
}


come faccio ad individuare la posizione j-esima di style.name???

ossia style.name1, style.name2

ESEMPIO io ho
Style 1
name=A
based=null
size=1

Style 2
name=B
based=A
size=null

Style 3
name C
based=B
size=3

dovrei fare se size è uguale a null
e based è diverso da null
dovrei confrontare il based dello style in cui sono (che deve rimanere FISSO) con name(che deve variare) e
se based e name sono uguali
dovrei fare diventare il size che prima era null uguale al size in cui è rispettata l'uguaglianza fra based e name...

In questo caso specifico dovrei fare diventare size di Style 2 = 3....

Come fare???

banryu79
21-01-2008, 08:35
Supponendo che:
1) styleObjects è la tua collezione di oggetti Style;
2) selectedStyle (vedi codice) è l'oggetto Style attuale di riferimento su cui fare i confronti;
3) ho capito quello che vuoi fare (:D )

non basta itereare nella collezione finchè non viene trovato il j-iesimo oggetto style che ha "name" uguale alla stringa "based" dell'oggetto Style di riferimento, al quale, a quel punto, gli si assegna come valore di "size" il valore di "size" del j-iesimo oggetto della collezione appena estratto?


Class Style
{
String name;
String based;
String size;
}

ed ho poi da una parte questo....

if(size==null)
{
if (style.based !=null)
{
Style selectedStyle = style; (in una certa posizione)

for ( int j = 0; j < styleObjects.size() ;j++)
{
// elementAt() o analogo codice per recuperare un elemento
Style aStyle = styleObjects.elementAt(j);

// se based e name sono uguali
// dovrei fare diventare il size che prima era null uguale al size in cui
// è rispettata l'uguaglianza fra based e name...
if( selectedStyle.based.equals( aStyle.name))
{
selectedStyle.size = aStyle.size;
}
}
}
}


Ciao :)

xxdavide84xx
21-01-2008, 08:52
Esatto!!!
Grazie, alla fine ero riuscito a risolvere questo problema...

Ma ora se ne pone un'altro....

Io scorro la mia lista di oggetti e quando trovo
es: string.name=A o B

più pèrecisamente così in java...

String stili_corretti = new String();
if (string.name.equals("A")||string.name.equals("B"))
stili_corretti=string.name;

Solo che se ho più di una A o una A e una B, lui mi mostra solo l'ultimo valore giusto?
Se io volessi memorizzare tutti i valori come dovrei fare? Usare un StringBuffer?? Che comando dovrei dare sotto però??? stili_corretti=??

^TiGeRShArK^
21-01-2008, 09:24
Esatto!!!
Grazie, alla fine ero riuscito a risolvere questo problema...

Ma ora se ne pone un'altro....

Io scorro la mia lista di oggetti e quando trovo
es: string.name=A o B

più pèrecisamente così in java...

String stili_corretti = new String();
if (string.name.equals("A")||string.name.equals("B"))
stili_corretti=string.name;

Solo che se ho più di una A o una A e una B, lui mi mostra solo l'ultimo valore giusto?
Se io volessi memorizzare tutti i valori come dovrei fare? Usare un StringBuffer?? Che comando dovrei dare sotto però??? stili_corretti=??
Le collections sono tue amiche :D

xxdavide84xx
21-01-2008, 09:30
Le collections sono tue amiche :D
Purtroppo perchè da una class Style grande, mi serve una class Style più piccola con solo certi parametri...

banryu79
21-01-2008, 10:25
Credo che TigerShark intenda dire che basta che memorizzi la sequenza di "name" in un vettore/array list.
Ti istanzi un bel ArrayList<String> e ci cacci dentro le stringhe "name" incontrate.

Anche se a questo punto ti conviene fare un ArrayList di oggetti Style (ArrayList<Style>) e cacciarci dentro i riferimenti degli style che hanno "name" uguale a "A" oppure "B" (in questo modo ti porti dietro tutte le info di quegli style, il loro "name" e il riferimento allo style che lo possiede, comunque questo dipende da cosa devi farci dopo).

xxdavide84xx
21-01-2008, 10:40
Credo che TigerShark intenda dire che basta che memorizzi la sequenza di "name" in un vettore/array list.
Ti istanzi un bel ArrayList<String> e ci cacci dentro le stringhe "name" incontrate.

Anche se a questo punto ti conviene fare un ArrayList di oggetti Style (ArrayList<Style>) e cacciarci dentro i riferimenti degli style che hanno "name" uguale a "A" oppure "B" (in questo modo ti porti dietro tutte le info di quegli style, il loro "name" e il riferimento allo style che lo possiede, comunque questo dipende da cosa devi farci dopo).

Mi devo portare dietro solo il name in quanto i controlli li ha fatti a monte...così, però sia in questo modo suggerito da voi:
private void STILI()
{
String style1 = new String();
ArrayList buffer = new ArrayList();
for ( int i = 0; i < styleObjects.size(); i++)
{
Style style = (Style)styleObjects.elementAt(i);
if ( style.jc != null && style.jc.equals("both") )
if ( style.font != null && style.font.equals("Times New Roman") )
if ( style.size != null )
if ( style.size.equals("24") || style.size.equals("26") )
if ( style.grassetto == null && style.italico == null && style.sottolineato == null )
{
style1=style.name;
buffer.add(style1);

}
}

}
che in quest'altro fatto da me
private void STILI()
{
String style1 = new String();
StringBuffer buffer = new StringBuffer();
for ( int i = 0; i < styleObjects.size(); i++)
{
Style style = (Style)styleObjects.elementAt(i);
if ( style.jc != null && style.jc.equals("both") )
if ( style.font != null && style.font.equals("Times New Roman") )
if ( style.size != null )
if ( style.size.equals("24") || style.size.equals("26") )
if ( style.grassetto == null && style.italico == null && style.sottolineato == null )
{
style1=style.name;
buffer.append(style1);

}
}
Se io faccio prima dell'ultima } System.out.println(buffer) mi restituisce tutti i valori desiderati uno dietro l'altro, però a me poi serviranno separati e non sono come fare..
es adesso mi viene [A , B ] nel primo caso e A B nel secondo...però a me poi servono i valori distinti: ossia A e B separati....
Ho provato a fare System.out.println(buffer.equals("A")), ma mi restituisce valore false, dove sbaglio???

banryu79
21-01-2008, 10:50
Se io faccio prima dell'ultima } System.out.println(buffer) mi restituisce tutti i valori desiderati uno dietro l'altro, però a me poi serviranno separati e non sono come fare..

Beh, nel caso dell'ArryList basta fare un ciclo for che recupera ogni elemento tramite il suo indice di posizione nell'array con il metodo buffer.elementAt(indice).
Oppure, se ti piace di più, con un ciclo while utilizzi un iterator e ti fai dare ogni stringa (ogni elemento).



es adesso mi viene [A , B ] nel primo caso e A B nel secondo...però a me poi servono i valori distinti: ossia A e B separati....

scusa, ma non hai i Javadoc? ti basta cercare il nome della classe (le Collection si trovano nel package java.util) e consultare quello che c'è scritto là: vedrai che trovi i metodi che fanno per te :)


Ho provato a fare System.out.println(buffer.equals("A")), ma mi restituisce valore false, dove sbaglio?

Ti pare che buffer sia uguale alla stringa "A"? (al limite buffer contiene, tra le altre, una o più stringhe uguali alla stringa "A").
Ripeto, leggi i Javadoc delle classi per sapere di preciso come si comportano i metodi delle classi che stai usando, non ti portano via molto tempo, te l'assicuro :)

xxdavide84xx
21-01-2008, 11:02
Beh, nel caso dell'ArryList basta fare un ciclo for che recupera ogni elemento tramite il suo indice di posizione nell'array con il metodo buffer.elementAt(indice).
Oppure, se ti piace di più, con un ciclo while utilizzi un iterator e ti fai dare ogni stringa (ogni elemento).



scusa, ma non hai i Javadoc? ti basta cercare il nome della classe (le Collection si trovano nel package java.util) e consultare quello che c'è scritto là: vedrai che trovi i metodi che fanno per te :)


Ti pare che buffer sia uguale alla stringa "A"? (al limite buffer contiene, tra le altre, una o più stringhe uguali alla stringa "A").
Ripeto, leggi i Javadoc delle classi per sapere di preciso come si comportano i metodi delle classi che stai usando, non ti portano via molto tempo, te l'assicuro :)


purtroppo non è possibile fare buffer.elementAt(indice) con ArrayList.....o almeno a me da ERRORE

banryu79
21-01-2008, 11:37
purtroppo non è possibile fare buffer.elementAt(indice) con ArrayList.....o almeno a me da ERRORE

Errore mio: elementAt() è un metodo della classe Vector.

Con ArrayList c'è il metodo get(indice).

xxdavide84xx
21-01-2008, 11:43
Perfetto!!!
infatti ora facendo cos'
private void STILI()
{
String style1 = new String();
ArrayList buffer = new ArrayList();
for ( int i = 0; i < styleObjects.size(); i++)
{
Style style = (Style)styleObjects.elementAt(i);
if ( style.jc != null && style.jc.equals("both") )
if ( style.font != null && style.font.equals("Times New Roman") )
if ( style.size != null )
if ( style.size.equals("24") || style.size.equals("26") )
if ( style.grassetto == null && style.italico == null && style.sottolineato == null )
{
style1 = style.name;
buffer.add(style1);
System.out.println(style1);
}
}

for(int j=0; j<buffer.size();j++)
{
System.out.println("PROVA" + buffer.get(j));
}
}

ora però mi sorge un'altra piccola domanda....
io ho questo metodo e lo devo fare interagire conun'altro....
ossia:private void STILI()
{
String style1 = new String();
ArrayList buffer = new ArrayList();
for ( int i = 0; i < styleObjects.size(); i++)
{
Style style = (Style)styleObjects.elementAt(i);
if ( style.jc != null && style.jc.equals("both") )
if ( style.font != null && style.font.equals("Times New Roman") )
if ( style.size != null )
if ( style.size.equals("24") || style.size.equals("26") )
if ( style.grassetto == null && style.italico == null && style.sottolineato == null )
{
style1 = style.name;
buffer.add(style1);
System.out.println(style1);
}
}}
ora devo farlo interagire con un'altro metodo:

private void aa()
{
for ( int i = 0; i < bodyObjects.size(); i++)
{
Body body = (Body)bodyObjects.elementAt(i);
if ( body.testo != null )
{
STILI();
for(int j=0; j<buffer1.size();j++)
{
if(body.name.equals(buffer1.get(j)))
System.out.println("OK");
}
}
}
}
Solo che buffer 1 non me lo riconosce...come posso fare questa volta?

banryu79
21-01-2008, 12:51
Perfetto!!!

private void aa()
{
for ( int i = 0; i < bodyObjects.size(); i++)
{
Body body = (Body)bodyObjects.elementAt(i);
if ( body.testo != null )
{
STILI();
for(int j=0; j<buffer1.size();j++)
{
if(body.name.equals(buffer1.get(j)))
System.out.println("OK");
}
}
}
}
Solo che buffer 1 non me lo riconosce...come posso fare questa volta?

Dove e come lo crei "buffer1"?

xxdavide84xx
21-01-2008, 12:56
Alla fine ho fatto così
private void aa()
{
for ( int i = 0; i < bodyObjects.size(); i++)
{
Body body = (Body)bodyObjects.elementAt(i);
if ( body.testo != null )
{
if ( body.testo.equalsIgnoreCase("relatore:") || body.testo.equalsIgnoreCase("relatore") )
System.out.println("OK relatore");
if ( body.testo.equalsIgnoreCase("presentata da:") || body.testo.equalsIgnoreCase("presentata da") )
System.out.println("OK presentata");
if ( body.testo.equalsIgnoreCase("sessione i") || body.testo.equalsIgnoreCase("sessione 1") )
System.out.println("OK Prima sessione");
if ( body.testo.equalsIgnoreCase("sessione ii") || body.testo.equalsIgnoreCase("sessione 2") )
System.out.println("OK Seconda sessione");
if ( body.testo.equalsIgnoreCase("sessione iii") || body.testo.equalsIgnoreCase("sessione 3") )
System.out.println("OK Terza sessione");
if ( body.testo.equalsIgnoreCase("indice") || body.testo.equalsIgnoreCase("ndice") )
System.out.println("OK INDICE");
if ( body.testo.equalsIgnoreCase("introduzione") || body.testo.equalsIgnoreCase("ntroduzione") )
System.out.println("OK INTRODUZIONE");
if ( body.testo.equalsIgnoreCase("conclusioni") || body.testo.equalsIgnoreCase("onclusioni") || body.testo.equalsIgnoreCase("conclusione") || body.testo.equalsIgnoreCase("onclusione") )
System.out.println("OK CONCLUSIONI");
if ( body.testo.equalsIgnoreCase("bibliografia") || body.testo.equalsIgnoreCase("ibliografia") || body.testo.equalsIgnoreCase("bibbliografia") || body.testo.equalsIgnoreCase("ibbliografia") )
System.out.println("OK BIBLIOGRAFIA");
ArrayList buffer1 = STILI();
for ( int j = 0; j < buffer1.size(); j++)
{
if ( body.stile.equals(buffer1.get(j)) )
System.out.println("PROVA!");
}
}

}
}


private ArrayList STILI()
{
String style1 = new String();
ArrayList buffer1 = new ArrayList();
for ( int i = 0; i < styleObjects.size(); i++)
{
Style style = (Style)styleObjects.elementAt(i);
if ( style.jc != null && style.jc.equals("both") )
if ( style.font != null && style.font.equals("Times New Roman") )
if ( style.size != null )
if ( style.size.equals("24") || style.size.equals("26") )
if ( style.grassetto == null && style.italico == null && style.sottolineato == null )
{
style1 = style.name;
buffer1.add(style1);
}
}
return buffer1;
}
e sembra che tutto funzioni bene...