PDA

View Full Version : [Java] Problema in inserimento in lista


gigippa
08-09-2008, 14:25
Ciao a tutti, devo creare un metodo di nome "inserisciDopoOgni(int valore, int in)" che inserisca dopo ogni occorrenza di "valore" un nuovo elemento contenente il dato "in" nella lista di partenza.
La lista è fatta così
public class MiaLista {

private class ListElem {
private int dato;
private ListElem next = null;
public int getDato() {
return dato;
}
public void setDato(int dato) {
this.dato = dato;
}
public ListElem getNext() {
return next;
}
public void setNext(ListElem next) {
this.next = next;
}
public boolean equals(int val) {
return dato == val;
}
}

private ListElem first;
public MiaLista() {
first = null;
}
}
E questo è il mio metodo. Non capisco perchè non mi aggiorni il primo 5 che compare. Mi aiutate? Grazie
public boolean inserisciDopoOgni(int valore, int in){

boolean found = false;
ListElem iterator = first;
while ((iterator.getNext()) != null)
if ((iterator.getNext()).equals(valore)) {
iterator = iterator.getNext();
ListElem elem = new ListElem();
elem.setDato(in);
elem.setNext(iterator.getNext());
iterator.setNext(elem);
found = true;
}
else
iterator = iterator.getNext();
return found;
}

banryu79
08-09-2008, 16:29
public boolean inserisciDopoOgni(int valore, int in){

boolean found = false;
ListElem iterator = first;
while ((iterator.getNext()) != null)
if ((iterator.getNext()).equals(valore)) {
iterator = iterator.getNext();
ListElem elem = new ListElem();
elem.setDato(in);
elem.setNext(iterator.getNext());
iterator.setNext(elem);
found = true;
}
else
iterator = iterator.getNext();
return found;
}

La parte in grassetto evidenzia un errore di semantica.
All'inizio fai puntare "iterator" al primo elemento ("first") della lista. Bene.
Però poi inizi la ricerca dal secondo elemento, di fatto non controllando se il primo combacia con il valore che stai cercando (infatti l'if che verifica la condizione non controlla il valore di "first" perchè chiama iterator.getNext() e controlla quindi il valore a partire dal secondo elemento).

Inoltre c'è un secondo errore di semantica:

while ((iterator.getNext()) != null)

Il ciclo così impostato esegue almeno un controllo se e solo se il secondo elemento della lista esiste [iterator è first; iterator.getNext() è il secondo elemento della lista]. Quindi se la tua lista è composta da un solo elemento la ricerca fallisce automaticamente.

Ti consiglio di includere sempre le parentesi, anche per istruzioni che non ne hanno strettamente bisogno, per ragioni di chiarezza nella lettura del codice; in questo modo è più facile rileggere velocemente quello che scrivi e hai meno possibilità di commettere errori, specie se devi editare il codice più volte.
(Cmq va a gusti).

public boolean inserisciDopoOgni(int valore, int in)
{
boolean found = false;
ListElem iterator = first;
while ((iterator.getNext()) != null)
{
if ((iterator.getNext()).equals(valore))
{
iterator = iterator.getNext();
ListElem elem = new ListElem();
elem.setDato(in);
elem.setNext(iterator.getNext());
iterator.setNext(elem);
found = true;
}
else
{
iterator = iterator.getNext();
}
}
return found;
}