Newsgroup: it.comp.java
Titolo: Vediamo se riuscite a trovare l'errore

Ciao ragazzi sapete dirmi perchè questa classe funziona correttamente se la
utilizzo da un programma pilota per verificarne il funzionamento ed invece
dal prog in andrebbe inserito funziona tutto tranne il metodo
containes(Object o)? Praticamente ritorna sempre false ed esegue sempre il
ramo else del metodo riportato.
Sotto c'è la classe Lista e piu' sotto ancora lo stralcio del main con le
dichiarazioni delle var e la chiamata al metodo.
NB
Gli oggetti di tipo lista sono variabili della classe Settore e la classe
Area è un array di Settore
Grazie in anticipo e scusate per la lunghezza.
 public class Lista
    {
    /** Metodi per manipolare le liste */
    /** Una lista e' un riferimento ad un oggetto della
    classe Link */
    private Node first;
    private String name;
    /** La classe Node definisce gli elementi della lista */
    private class Node
    {
        Object data;
        Node next;
    }
    /**
    Costruisce una lista concatenata vuota.
    */
    public Lista()
    {
        first = null;
    }
    public Lista(String s)
    {
 
this.name
 = s;
        first = null;
    }
    /**
    Aggiunge un elemento in testa alla lista concatenata.
    @param obj l'oggetto da aggiungere
    */
    public void addFirst(Object obj)
    {
        Node newLink = new Node();
        newLink.data = obj;
        newLink.next = first;
        first = newLink;
    }
    /**
    Toglie il primo elemento dalla lista concatenata.
    @return l'elemento eliminato
    */
    public Object removeFirst()
    {
        if (first == null)
        return null;
        else {
        Object obj = first.data;
        first = first.next;
        return obj;
        }
    }
    /**
    Restituisce il primo elemento della lista concatenata.
    @return il primo elemento della lista concatenata
    */
    public Object getFirst()
    {
        if (first == null)
        return null;
        else
        return first.data;
    }
    /**
    Aggiunge un elemento in fondo alla lista concatenata.
    @param obj l'oggetto da aggiungere
    */
    public void add(Object obj) {
        Node newLink = new Node();
        newLink.data = obj;
        newLink.next = null;
        if (first == null)
        first = newLink;
        else {
        Node temp = first;
        while(temp.next != null)
        temp = temp.next;
        temp.next = newLink;
        }
    }
    /**
    Toglie la prima occorrenza di un elemento dalla
    lista concatenata
    @param l'oggetto da eliminare
    @return true se almeno un elemento è stato eliminato
    dalla lista concatenata.
    */
    public boolean remove (Object obj)
    {
        boolean found = false;
        Node position = first;
        Node previous = null;
        while ((!found) && (position != null))
        {
        if ((position.data).equals(obj))
        found = true;
        else
        {
        previous = position;
        position = position.next;
        }
        }
        if (found)
        if (position == first)
        first = first.next;
        else
        previous.next = position.next;
        return found;
        }
    /**
    Controlla la presenza di un oggetto nella
    lista concatenata
    @param l'oggetto da controllare
    @return true se almeno un'occorrenza
    dell'elemento è trovata
    */
    public boolean contains(Object obj)
    {
      //boolean found = false;
      Node l = first;
      while (l != null)
        if ((l.data).equals(obj))
          return true;
        else
          l = l.next;
      return false;
    }
    /*public boolean get(Object i)
    {
    boolean found = false;
    Node l = first;
    Docente u = (Docente)l.data;
    while ((!found) && (l != null))
    if (u.isequal(obj))
    found = true;
    else
    l = l.next;
    return found;
    }*/
    public void toPrint(){
        Node l = first;
        while(l != null)
        {
          System.out.println(l.data.toString());
          l = l.next;
        }
    }
    public void clear(){
        first.next = null;
    }
    public String view()
    {
        String s = "";
        Node n = first;
        while(n != null){
           s = s + n.data.toString();
           n = n.next;}
        return s;
    }
    }
Class Facolta
...
Cut
protected final String[] nomeArea = {"Informatica","Matematica","Chimica",
                                "Fisica", "Biologia"};
    protected final String[] codiciSettore =
{"INF","MAT","CHI","FIS","BIO"};
    protected String[] myString;
    protected Area [] aree;
    List corsi;
    List doc;
    int a,s =0;
//costruttore
public Facolta() {
//inizializzo le var
initAree();
doc = aree[a].settori[s].getListD();
}
public void initAree()
    {
        //String[][] set = new String[5][10];
        aree = new Area[nomeArea.length];
        comboAree = new JComboBox(nomeArea);
        for(int i = 0; i < nomeArea.length; i++)
          aree[i] = new Area(nomeArea[i], codiciSettore[i]);
        comboAree.setSelectedIndex(0);
        /**/
        comboAree.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e) {
            JComboBox cb = (JComboBox)e.getSource();
            a = cb.getSelectedIndex();
            aggiorna(a);
        }
        });
        int dim = aree[comboAree.getSelectedIndex()].getAreaDim();
        myString = new String[dim];
        for(int i = 0; i < dim; i++)
        {
            myString[i] =
(aree[comboAree.getSelectedIndex()].settori[i].getSectorName());
        }
      //  docenti = aree[comboAree.getSelectedIndex()].settori[0].docenti;
    }
//metodo incriminato
if(e.getSource() == remove)
        {
            int pres = beccaNumero(day.getText());
            //boolean b = false;
            //doc = aree[a].settori[s].getListD();
            Docente d = new Docente(name.getText(), surname.getText(),pres);
            //boolean b = doc.contains(d);
            if(doc.deleteItem(d))
                JOptionPane.showMessageDialog(null,"Docente "+
(d.toString()) +
                " eliminato", "Delete",JOptionPane.PLAIN_MESSAGE);
            else JOptionPane.showMessageDialog(null,"Il docente "+
(d.toString()) +
                 " non esiste", "Delete",JOptionPane.PLAIN_MESSAGE);
        }

 ha scritto nel messaggio
news:cak86j$4pg$1...@newsreader.mailgate.org...



Ciao Sara grazie per aver risposto. Ho provato con la seconda possibilità.
Adesso per sicurezza riprovo e provo la prima soluzione suggerita.
Ciao

Il confronto tra stringhe ora va!!!!!!
Ti sarò infinitamente grato per questo.
Ciao grazie mille!!!
Certo però che sono un bel testone 10 giorni persi per un toString() :-(
Sono felicissimo però!!!
Ciao

Spaten wrote:

Non ho analizzato il tuo codice ma...
... una domanda mi sorge spontanea:
   Perché ti sei ri-implementato le tue Liste
   quando ci sono fior fiore di Liste già disponibili in Java?
Lo so che può sembrare una domanda sterile...
... ma io continuo a non capire chi si fa le proprie implementazioni
dei vari Container già presenti in Java.
Lo posso capire solo come esercizio dato a studenti che devono
imparare il linguaggio, ma sicuramente non lo "accetto"
dentro un software che realizza un verto business.
- Dario (sempre scettico)

 ramo else del metodo riportato.
Per fare in modo che la tua classe Node risponda in modo corretto alla
chiamata a equals, devi implementare il metodo equals(Object obj) e, di
conseguenza, sei obbligato anche a ridefinire il metodo hashCode(), per
rispettare il contratto che due oggetti "equals" devono avere anche lo
stesso valore di hashCode.
Tutti e due i metodi li erediti direttamente da Object.
ciao,
Maurizio.

Spaten wrote:

Sara molto probabilmente è felicissima del tuo amore...
... ma tu hai "veramente" capito qual'è il problema che tu hai risolto
con il work-around del toString() ?
Molto probabilmente, infatti, il toString è solo un metodo
per "girare attorno" (work-around in inglese!) ad un tuo
bug progettuale.
Se hai capito il bug, bene! Molto probabilmente non ti serve
neppure il work-around perché molto probabilmente risolverai
a priori il tuou bug!
Se invece non hai capito il bug, allora il work-around funzionerà
ma il tuo software continuerà ad avere un bug che sicuramente
(la legge di Murphy lo insegna) prima o poi si ri-presenterà!
- Dario (sempre + scettico!)
E, comunque, cerca di capire anche perché ti sei impegolato
nel riscrivere una funzionalità (quella delle liste) già
presente in Java.
Di solito riscrivere cose già perfettamente testate
da migliaia di utenti nel mondo non mi sembra (sembra a mio
modesto parere) una buona cosa...
di utenti

 modesto parere) una buona cosa...
concordo con quanto scritto da Dario. La soluzione proposta da Sara, risolve
sicuramente il problema. Ma è solo una soluzione locale. Sarebbe
interessante che Spaten faccia lo sforzo di capire come mai la sua classe
non funzione in produzione in modo da avere un disegno di classi più
efficente.
Inoltre, anch'io sono per evitare il più possibile la scrittura di codice ad
hoc. Soprattutto, se nell'SDK di java trovo già implementate le classi e le
funzionalità che mi servono, anche perché queste sono già testate, e sono
state studiate per funzionare in contesti anche molto diversi tra loro, cose
che io, da solo, non potrei mai fare, sia per motivi di tempo, sia per
motivi di conoscenza ed esperienza. Ovvero, per riprendere il caso in esame,
le classi disegnate da Spaten funzionano in un ambiente di sviluppo, ma non
funzionano in produzione: l'utilizzo di codice già strutturato e già
testato, mi riduce al minimo le possibilità di errore, specialmente in quei
casi in cui il "prodotto" deve lavorare in situazioni di stress, (che cosa
succede nel momento in cui la tua struttura deve gestire migliaia o milioni
di nodi ? Come si modificano la performance in questo caso ?)
Ciao,
Maurizio.


Hai colto nel segno, devo dare l'esame di algoritmi e strutture dati.
Comunque il problema si presentava anche con la LinkedList della libreria
standard di java.
Il metodo equals faceva la bizze, e sarei felice di sapere il perchč.
Per ora mi accontento di utilizzare stringhe per il confronto, intanto posso
andare avanti.
Per il resto sono d'accordo con te, a cosa serve "reinventare la ruota" ?
Ciao!


Ciao e grazie a tutti!

 Per il resto sono d'accordo con te, a cosa serve "reinventare la ruota" ?
Bene!
- Dario (un po' + rinfrancato)