Array di oggetti

di il
3 risposte

Array di oggetti

Ciao a tutti/e,
ho fatto un esercizio in cui ho 3 classi:
- quella contenente il main
- una classe CD
- una classe PortaCD (contenente un vettore di CD).
Ho un problema col metodo "confronta" della classe PortaCD, che deve confrontare 2 oggetti di classe PortaCD e dire se contengono gli stessi cd oppure no.
L'errore mi viene segnalato nell'istruzione
if (!contenitore[i].equals(p[j]))
il compilatore dice
array required, PortaCD found
Non riesco a capire che problema c'è....

Classe CD:

package luca3;

public class CD {
    // ATTRIBUTI
    private String titolo;
    private String autore;
    private int numero_brani;
    private int durata;         // durata in minuti
    
    // COSTRUTTORE PARAMETRICO
    public CD(String titolo, String autore, int numero_brani, int durata) {
        this.titolo = titolo;
        this.autore = autore;
        this.numero_brani = numero_brani;
        this.durata = durata;
    }
    
    // COSTRUTTORE DI DEFAULT
    public CD() {}
    
    // GETTER E SETTER
    public String getTitolo() { return titolo; }
    public void setTitolo(String titolo) { this.titolo = titolo; }
    public String getAutore() { return autore; }
    public void setAutore(String autore) { this.autore = autore; }
    public int getNumero_brani() { return numero_brani; }
    public void setNumero_brani(int numero_brani) { this.numero_brani = numero_brani; }
    public int getDurata() { return durata; }
    public void setDurata(int durata) { this.durata = durata; }
    
    public boolean equals(CD c){
        if (titolo == c.titolo && autore == c.autore && numero_brani == c.numero_brani && durata == c.durata)
            return true;
        return false;
    }
    
} // fine classe

Classe PortaCD:

package luca3;

import java.util.Scanner;

public class PortaCD {
    Scanner tastiera = new Scanner(System.in);
    CD [] contenitore = new CD[100];
    int numeroCD;
    int dimensioneContenitore;
            
    // COSTRUTTORE
    public PortaCD (int n){
        for (int i = 0; i < n; i++)
            contenitore[i] = new CD();
        numeroCD = 0;
        dimensioneContenitore = n;
    }
    
    // METODI
    public void inserisciCD (String titolo, String autore, int numero_brani, int durata){
        contenitore[numeroCD].setTitolo(titolo);
        contenitore[numeroCD].setAutore(autore);
        contenitore[numeroCD].setNumero_brani(numero_brani);
        contenitore[numeroCD].setDurata(durata);
        numeroCD++;
    }
    
    public CD getCD (int posizione){
        return contenitore[posizione];
    }
    
    public void setCD (int posizione, CD cd){
        contenitore[posizione] = cd;
    }
    
    public void killCD (int posizione){
        contenitore[posizione] = null;
        numeroCD--;
    }
    
    public int getN () { 
        return numeroCD;
    }
    
    public int cercaCDperTitolo (String titolo){
        for (int i = 0; i < numeroCD; i++)
            if (contenitore[i].getTitolo() == titolo)
                return i;
        return -1;
    }
    
    @Override
    public String toString(){
        String titoli = "";
        for (int i = 0; i < numeroCD; i++)
            titoli += contenitore[i].getTitolo() + " ";
        return titoli;
    }

    
    public boolean confronta (PortaCD p){
        if (this.numeroCD != p.numeroCD)
            return false;
        else{
            // se i 2 vettori contengono lo stesso numero di oggetti
            for (int i = 0; i < dimensioneContenitore; i++)
                if (contenitore[i] != null)
                    for (int j = 0; j < dimensioneContenitore; j++)
                        if (!contenitore[i].equals(p[j]))	//ERRORE!!!
                            return false;  
            return true;
        }
    } 

}   // fine classe

3 Risposte

  • Re: Array di oggetti

    mauronew ha scritto:


    L'errore mi viene segnalato nell'istruzione
    if (!contenitore[i].equals(p[j]))
    il compilatore dice
    array required, PortaCD found
    Non riesco a capire che problema c'è....
    Quel p è un oggetto PortaCD ... non è un array. Devi arrivare al contenitore di p.

    Comunque il contenuto delle stringhe (e in generale degli oggetti) non si confronta con == ma con il metodo equals(Object) degli oggetti.
    Quindi:
    if (contenitore[i].getTitolo() == titolo)

    è sbagliato, come anche

    if (titolo == c.titolo && autore == c.autore && numero_brani == c.numero_brani && durata == c.durata)

    Ci sono anche altre incoerenze, ecc.. ma sistema prima queste cose.
  • Re: Array di oggetti

    Grazie Andrea, errori corretti:

    1) ora i confronti tra le stringhe li faccio col metodo equals():
    
    public boolean equals (CD c){
            if (titolo.equals(c.titolo) && 
                autore.equals(c.autore) && 
                numero_brani == c.numero_brani && 
                durata == c.durata)
                return true;
            return false;
        }
    
    Come mai stavolta l'IDE non mi propone di aggiungere @Override in testa al metodo equals(), mentre lo ha fatto con il metodo toString()?

    2) nel metodo confronta() oltre all'errore che avevo segnalato nel prost precedente, c'era anche un problema di logica (infatti il metodo restituiva sempre "false")
    
    public boolean confronta (PortaCD p){
            int i, j;
            if (this.numeroCD != p.numeroCD)
                return false;
            else{
                // se i 2 vettori contengono lo stesso numero di oggetti cerco gli
                // oggetti del primo nel secondo
                for (i = 0; i < dimensioneContenitore; i++)
                    if (contenitore[i] != null){
                        for (j = 0; j < dimensioneContenitore; j++)
                            if (contenitore[i].equals(p.contenitore[j]))
                                break;
                        if (j == dimensioneContenitore)  
                                return false;  
                    }  
                return true;
            }
        }
    
    Quali sono le altre incoerenze?
  • Re: Array di oggetti

    mauronew ha scritto:


    Come mai stavolta l'IDE non mi propone di aggiungere @Override in testa al metodo equals(), mentre lo ha fatto con il metodo toString()?
    Perchè il metodo equals() ha una firma diversa. Quello che hai fatto tu, in pratica, è un overload, non un override.
    Il metodo equals() da porre in override ha questa firma:
    
    public boolean equals(Object obj)
    
Devi accedere o registrarti per scrivere nel forum
3 risposte