PDA

View Full Version : [Java] Lista concatenata, errore nel metodo aggiungi... ma dove?


luxorl
22-06-2005, 16:32
Salve a tutti,
ho da poco finito un package in java che risolve, date le lettere e le parole da trovare, il classico giochino da settimana enigmistica in cui bisogna cercare dellle parole in tutte le direzioni in mezzo a tante lettere, comuqnue bando alle cianci :p andiamo al problema...

Se il programma trova più di tre parole al quarto inserimento ritorna un errore nel metodo aggiungi.. vi incollo il metodo, vedete se indivituate il perchè :confused:


class Nodo{
Nodo next;
Parola info;
}

public class FoundLC extends Found{
Nodo inizio=null;

public void aggiungi(Parola p){
Nodo nuovo=new Nodo();
nuovo.info=p;
if(inizio==null){
inizio=nuovo;
nuovo.next=null;
}else{
Nodo cor=inizio;
Nodo pre=null;
while(cor!=null && cor.info.compareTo(nuovo.info)<=0){
pre=cor;
cor=cor.next;
}
pre.next=nuovo;
nuovo.next=cor;
}
}//AGGIUNGI


A me sembra tutto giusto! :(

Come sempre Grazie a tutti :mano:

franksisca
22-06-2005, 16:48
mi dice che errore ti dice?

luxorl
22-06-2005, 17:02
mi dice che errore ti dice?

Esecuzione in cui il metodo aggiungi è come l'ho incollato sopra:

C:\poo\appelli\puzzle
Numero righe: 6
Numero colonne: 6
Carattere <0;0>: a
Carattere <0;1>: b
Carattere <0;2>: c
Carattere <0;3>: d
Carattere <0;4>: e
Carattere <0;5>: f
Carattere <1;0>: g
Carattere <1;1>: h
Carattere <1;2>: i
Carattere <1;3>: l
Carattere <1;4>: m
Carattere <1;5>: u
Carattere <2;0>: t
Carattere <2;1>: fs
Carattere <2;2>: wd
Carattere <2;3>: dfdsf
Carattere <2;4>: dfdsfgds
Carattere <2;5>: fgdsgsd
Carattere <3;0>: gsdge
Carattere <3;1>: gewfqe
Carattere <3;2>: grehth
Carattere <3;3>: yjuj
Carattere <3;4>: jt
Carattere <3;5>: d
Carattere <4;0>: s
Carattere <4;1>: x
Carattere <4;2>: f
Carattere <4;3>: yhy
Carattere <4;4>: ui
Carattere <4;5>: iy
Carattere <5;0>: rr
Carattere <5;1>: ww
Carattere <5;2>: q
Carattere <5;3>: s
Carattere <5;4>: x
Carattere <5;5>: a

a b c d e f

g h i l m u

t f w d d f

g g g y j d

s x f y u i

r w q s x a

Quante Parole vuoi ricercare? 5
Parola numero 1 da Ricercare: abc
Parola numero 2 da Ricercare: fuf
Exception in thread "main" java.lang.NullPointerException
at poo.appelli.puzzle.FoundLC.aggiungi(FoundLC.java:26)
at poo.appelli.puzzle.FoundLC.cercaSud(FoundLC.java:101)
at poo.appelli.puzzle.FoundLC.risolvi(FoundLC.java:70)
at poo.appelli.puzzle.TestPuzzle.main(TestPuzzle.java:33)
Premere un tasto per continuare . . .


Esecuzione in cui il metodo aggiungi e stato reso come un "aggiungiInCoda"
cioè eliminando la seconda condizione nel while di scorrimento:

public void aggiungi(Parola p){
Nodo nuovo=new Nodo();
nuovo.info=p;
if(inizio==null){
inizio=nuovo;
nuovo.next=null;
}else{
Nodo cor=inizio;
Nodo pre=null;
while(cor!=null /*&& cor.info.compareTo(nuovo.info)<=0 */){
pre=cor;
cor=cor.next;
}
pre.next=nuovo;
nuovo.next=cor;
}
}//AGGIUNGI


Ed Ecco l'esecuzione impeccabile:

C:\poo\appelli\puzzle
Numero righe: 6
Numero colonne: 6
Carattere <0;0>: sdfsaffd
Carattere <0;1>: fdsfsdvsds
Carattere <0;2>: ad
Carattere <0;3>: sdvsd
Carattere <0;4>: asfdas
Carattere <0;5>: fr
Carattere <1;0>: d
Carattere <1;1>: sad
Carattere <1;2>: dsdf
Carattere <1;3>: strh
Carattere <1;4>: fbf
Carattere <1;5>: as
Carattere <2;0>: dfgdasfg
Carattere <2;1>: rgdf
Carattere <2;2>: bcv
Carattere <2;3>: sdfv
Carattere <2;4>: dfsvb
Carattere <2;5>: fbgf
Carattere <3;0>: dhdf
Carattere <3;1>: ghg
Carattere <3;2>: hsd
Carattere <3;3>: gr
Carattere <3;4>: g
Carattere <3;5>: dfgbhbtd
Carattere <4;0>: gh
Carattere <4;1>: dsfnb
Carattere <4;2>: fsd
Carattere <4;3>: bdf
Carattere <4;4>: bfd
Carattere <4;5>: bf
Carattere <5;0>: bfd
Carattere <5;1>: bfdb
Carattere <5;2>: dfbsa
Carattere <5;3>: gb
Carattere <5;4>: rhtgh
Carattere <5;5>: gh

s f a s a f

d s d s f a

d r b s d f

d g h g g d

g d f b b b

b b d g r g

Quante Parole vuoi ricercare? 5
Parola numero 1 da Ricercare: faf
Parola numero 2 da Ricercare: dsd
Parola numero 3 da Ricercare: bbb
Parola numero 4 da Ricercare: gbg
Parola numero 5 da Ricercare: dddddddd

faf <0;5> Direzione Sud
faf <2;5> Direzione Nord
dsd <1;0> Direzione Est
dsd <1;2> Direzione Ovest
bbb <4;3> Direzione Est
bbb <4;5> Direzione Ovest
gbg <3;3> Direzione Sud
gbg <3;3> Direzione SudEst
gbg <5;3> Direzione Nord
gbg <5;5> Direzione NordOvest

Premere un tasto per continuare . . .

franksisca
22-06-2005, 17:27
Ed Ecco l'esecuzione impeccabile:

C:\poo\appelli\puzzle
Numero righe: 6
Numero colonne: 6
Carattere <0;0>: sdfsaffd
Carattere <0;1>: fdsfsdvsds
Carattere <0;2>: ad
Carattere <0;3>: sdvsd
Carattere <0;4>: asfdas
Carattere <0;5>: fr
Carattere <1;0>: d
Carattere <1;1>: sad
Carattere <1;2>: dsdf
Carattere <1;3>: strh
Carattere <1;4>: fbf
Carattere <1;5>: as
Carattere <2;0>: dfgdasfg
Carattere <2;1>: rgdf
Carattere <2;2>: bcv
Carattere <2;3>: sdfv
Carattere <2;4>: dfsvb
Carattere <2;5>: fbgf
Carattere <3;0>: dhdf
Carattere <3;1>: ghg
Carattere <3;2>: hsd
Carattere <3;3>: gr
Carattere <3;4>: g
Carattere <3;5>: dfgbhbtd
Carattere <4;0>: gh
Carattere <4;1>: dsfnb
Carattere <4;2>: fsd
Carattere <4;3>: bdf
Carattere <4;4>: bfd
Carattere <4;5>: bf
Carattere <5;0>: bfd
Carattere <5;1>: bfdb
Carattere <5;2>: dfbsa
Carattere <5;3>: gb
Carattere <5;4>: rhtgh
Carattere <5;5>: gh

s f a s a f

d s d s f a

d r b s d f

d g h g g d

g d f b b b

b b d g r g

Quante Parole vuoi ricercare? 5
Parola numero 1 da Ricercare: faf
Parola numero 2 da Ricercare: dsd
Parola numero 3 da Ricercare: bbb
Parola numero 4 da Ricercare: gbg
Parola numero 5 da Ricercare: dddddddd

faf <0;5> Direzione Sud
faf <2;5> Direzione Nord
dsd <1;0> Direzione Est
dsd <1;2> Direzione Ovest
bbb <4;3> Direzione Est
bbb <4;5> Direzione Ovest <--------
gbg <3;3> Direzione Sud <--------
gbg <3;3> Direzione SudEst<--------
gbg <5;3> Direzione Nord<--------
gbg <5;5> Direzione NordOvest<--------

Premere un tasto per continuare . . .


non credo che sia proprio impeccabile.....

luxorl
22-06-2005, 17:37
non credo che sia proprio impeccabile.....

E perchè?
Comunque impeccabile nel senso che non mi da l'errore in questione.
Che neanche tu vedo che trovi...

luxorl
22-06-2005, 17:49
E comunque:


faf <0;5> Direzione Sud
faf <2;5> Direzione Nord
dsd <1;0> Direzione Est
dsd <1;2> Direzione Ovest
bbb <4;3> Direzione Est
bbb <4;5> Direzione Ovest <-------- ESATTO
gbg <3;3> Direzione Sud <-------- ESATTO
gbg <3;3> Direzione SudEst<-------- ESATTO
gbg <5;3> Direzione Nord<-------- ESATTO
gbg <5;5> Direzione NordOvest<-------- ESATTO


Ci vedi bene? :Prrr:

Dunque
Risottolineo: Impeccabile :p

Comunque l'errore che cerco e non trovo l'ho detto prima qual è.. qualcuno a qualche idea?

franksisca
22-06-2005, 19:16
Dato che quello che stai facendo è l'appelo di poo del prof. NIGRO :) :( :) ,(anchio sto all'unical.........e quell'appello quando preparavo POO l'ho odiato :mad: :mad: :mad: :mad: :mad: ) ti posso assicurare che se fai quattro spostamenti per trovare una parola di tre lettere e due per trovare una di uguale lunghezza, qualcosa non và(vedi per trovare bbb fai due spostamenti, mentre per trovare gbg ne fai 4).Per quanto riguarda il codice, se vedi ti dà un NullPointerException, e dando per sciontato che tu sappia cosa sia(altrimenti zio Libero ti uccide) controllati il compare tu, e posta il metodo cercaSud, che vediamo cosa c'è scritto, anche se l'errore non sarà là.
Comunque, visto che ci sei, controlla il compareTo nella classe parola.
Poi, se vuoi posta anche il risolvi, che vediamo se è tutto ok?

luxorl
22-06-2005, 21:35
Dato che quello che stai facendo è l'appelo di poo del prof. NIGRO :) :( :) ,(anchio sto all'unical.........e quell'appello quando preparavo POO l'ho odiato :mad: :mad: :mad: :mad: :mad: ) ti posso assicurare che se fai quattro spostamenti per trovare una parola di tre lettere e due per trovare una di uguale lunghezza, qualcosa non và(vedi per trovare bbb fai due spostamenti, mentre per trovare gbg ne fai 4).

:confused: :confused:

non penso tu abbia molto chiaro il programma, cmq non fa 4 spostamenti.. ma la parola è presente 4 volte.. a quelle cordinate numeriche e che si estende lungo quella direzione... ripeto da questo punto di vista il programma è impeccabile!


Per quanto riguarda il codice, se vedi ti dà un NullPointerException,


ma è dall'inizio che lo dico.. e vorrei sapere perchè...
inserisce massimo tre parole e poi faglia!

DarkMic
22-06-2005, 21:46
Dimmi se ho capito il problema?

Se inserisci in coda il programma funziona, mentre se inserisci in testa non funziona o meglio dire dà errore di NullPointerException.

end.is.forever
22-06-2005, 22:45
Evidentemente p è null; l'errore è da un'altra parte.

franksisca
23-06-2005, 08:57
:confused: :confused:

non penso tu abbia molto chiaro il programma, cmq non fa 4 spostamenti.. ma la parola è presente 4 volte.. a quelle cordinate numeriche e che si estende lungo quella direzione... ripeto da questo punto di vista il programma è impeccabile!



ma è dall'inizio che lo dico.. e vorrei sapere perchè...
inserisce massimo tre parole e poi faglia!
Allora sì, per questo ti avevo chiesto il template risolvi.
Cmq il problema credo che sia nelle inizializzazioni delle variabili, se posti la cartella del prgetto zippata con tutti i sorgenti lo possimao anche aggiustare.

luxorl
23-06-2005, 14:22
Dimmi se ho capito il problema?

Se inserisci in coda il programma funziona, mentre se inserisci in testa non funziona o meglio dire dà errore di NullPointerException.

Non in testa ma cercare di ordinare secondo questo compareTo:


public int compareTo(Object ob){
Parola p=(Parola)ob;
if(this.equals(p)) return 0;
if(this.parola.length()<p.parola.length()) return -1;
if(this.parola.length()>p.parola.length()) return +1;
if(this.parola.length()==p.parola.length() && this.direzione<p.direzione) return +1;
if(this.parola.length()==p.parola.length() && this.direzione>p.direzione) return -1;
if(this.parola.length()==p.parola.length() && this.direzione==p.direzione && this.parola.compareTo(p.parola)<0) return -1;
if(this.parola.length()==p.parola.length() && this.direzione==p.direzione && this.parola.compareTo(p.parola)>0) return +1;
return 0;
}


Non capisco perchè... praticamente de nel metodo aggiungo nel while di scorrimento se lascio solo la condizione finchè cor è diverso da null (inserimento in coda) funziona tutto alla perfezione, se invece al while aggiungo la condizione: && compareTo<=0 (quindi inserimento ordinato mediante il compareTo di sopra) dopo tre inserimenti mi da l'errore di nullpointerexception...

capito?

luxorl
23-06-2005, 14:25
Evidentemente p è null; l'errore è da un'altra parte.

In che senso?

l'errore non può che essere là (date una controllate per favore a come collego il nuovo "vagoncino" con pre e cor) oppure nel compareTo, perchè se elimino la seconda condizione nel while tutto funziona bene!

end.is.forever
23-06-2005, 15:04
In che senso?

l'errore non può che essere là (date una controllate per favore a come collego il nuovo "vagoncino" con pre e cor) oppure nel compareTo, perchè se elimino la seconda condizione nel while tutto funziona bene!

Non hai messo precondizioni su p; per cui se il gli passi p null da NullPointerException quando cerchi di referenziare il metodo compareTo che manca.

demetriol
23-06-2005, 15:56
:) Nigro :)

Cmq secondo me il problema è il compareTo(), l'hai definito cerrettamente in "Parola"?

Io ho avuto un problema analogo in un altro programma...

franksisca
23-06-2005, 16:06
sxusa, faccio una considerazione stupida, ma provala.
Concatena gli if con degli else, ovvero, non mettere tutti if, ma fai delle concatenazioni if(){...}else if(){...}, e prova, e poi dici che succede.

luxorl
23-06-2005, 17:21
Non hai messo precondizioni su p; per cui se il gli passi p null da NullPointerException quando cerchi di referenziare il metodo compareTo che manca.

ma p non può essere null, è un oggetto parola che aggiungo solo se creo, e creo solo se trovo la parola nel puzzle, e se lo creo gli passo i parametri.. non può essere mai null!

luxorl
23-06-2005, 17:22
:) Nigro :)

Cmq secondo me il problema è il compareTo(), l'hai definito cerrettamente in "Parola"?

Io ho avuto un problema analogo in un altro programma...

Ho postato anche il compareTo.. cmq fra un po' posto tutto il package

luxorl
23-06-2005, 17:25
sxusa, faccio una considerazione stupida, ma provala.
Concatena gli if con degli else, ovvero, non mettere tutti if, ma fai delle concatenazioni if(){...}else if(){...}, e prova, e poi dici che succede.

No scusa, ma non la provo, perchè penso non servi a nulla!
Il mio compareTo ritorna in ogni caso un intero.. che "male che va" (cioè se nessun if è true) è uguale a 0 (ultima riga = return 0;)

luxorl
23-06-2005, 17:27
Ecco il package, manca il main però che l'ho rovinato per dei test... ed ora non ho il tempo per riscriverlo!

end.is.forever
24-06-2005, 13:27
Io dico che p è null. Fai un po' di debug.