Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

di il
14 risposte

Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

Implementare creando classi apposite i seguenti concetti.
Un negozio di animali ha a disposizione un certo insieme di animali di ogni tipo. Il numero di animali può variare in base all'arrivo di nuovi cuccioli o alla vendita di alcuni animali. Un animale ha un certo nome un pedigree, una data di nascita e un prezzo. Gli animali trattati dal negozio sono prevalentemente cani e gatti. Un cane è caratterizzato dalla sua razza il gatto invece dal colore.
NOTA: NON È RICHIESTA UNA CLASSE DI COLLAUDO.

Dopo aver creato la classe animale la classe cane e quella gatto quando arrivo nella classe negozio animali non so come inserire i metodi per aggiungere e rimuovere un animale dall'ArrayList.
Grazie a chiunque risponda.

14 Risposte

  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    Dopo aver creato la classe animale la classe cane e quella gatto
    Chiariamo subito una cosa: in uno scenario del genere, le classi Cane e Gatto dovrebbero estendere la classe Animale. E Animale dovrebbe essere ragionevolmente una classe "astratta" (se non ci sono altre questioni particolari).

    geeno97 ha scritto:


    quando arrivo nella classe negozio animali non so come inserire i metodi per aggiungere e rimuovere un animale dall'ArrayList.
    La classe Negozio dovrebbe quindi tenere una variabile di istanza List<Animale> (poi chiaramente istanzierai un ArrayList<Animale> ).

    Mostra del codice ed esponi meglio i tuoi dubbi comunque.
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    Public class Animale{
    private String nome;
    private String pedigree;
    private String dataDiNascita;
    private int prezzo;

    public Animale(String nome, String pedigree, String dataDiNascita, int prezzo){
    this.nome=nome;
    this.pedigree=pedigree;
    this.dataDiNascita=dataDiNascita;
    this.prezzo=prezzo;
    }
    public String getNome(){
    return nome;
    }
    public String setNome(){
    this.nome=nome;
    }
    public String getPedigree(){
    return pedigree;
    }
    public String getDataDiNascita(){
    return dataDiNascita;
    }
    public int getPrezzo(){
    return prezzo;
    }
    }
    Questa è la classe animale...puoi dirmi perche devo farla astratta?
    Classe cane
    public class Cane extends Animale{
    private String razza;

    public Cane(Sring nome, String pedigree, String dataDiNascita, int prezzo, String razza){
    super(nome,pedigree,dataDiNascita,prezzo);
    this.razza=razza;
    }
    public String getRazza(){
    return razza;
    }
    public String setRazza(){
    this.razza=razza;
    }
    }
    Classe gatto
    public class Gatto extends Animale{
    private String colore;

    public Cane(Sring nome, String pedigree, String dataDiNascita, int prezzo, String colore){
    super(nome,pedigree,dataDiNascita,prezzo);
    this.colore=colore;
    }
    public String getColore(){
    return colore;
    }
    public String setColore(){
    this.colore=colore;
    }
    }
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    Il mio dubbio è su come gestire senza classe di collaudo i metodi per aggiungere o rimuovere un animale dall'insime
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    Questa è la classe animale...puoi dirmi perche devo farla astratta?
    Le classi Animale/Cane/Gatto in generale vanno bene e sono strutturalmente corrette (campi private ok, costruttori ok, metodi getter/setter public ok).

    C'è qualche piccolo errorino di scrittura. In due punti Sring invece che String e in Gatto hai il costruttore che si chiama Cane. Questi errori li scopriresti comunque quando tenti di compilare.

    Concettualmente si potrebbe discutere. razza è solo in Cane ma anche per i gatti ci sono razze diverse. Cosa similare per il colore.

    Comunque una classe si marca abstract quando non ha senso che venga istanziata, perché magari (tipicamente) rappresenta un concetto molto generalizzato ed appunto astratto. Scenario simile: una classe Solido con sotto-classi Cubo, Sfera, ecc... Ha senso poter fare: new Solido() ? Solido de chè?? In tal caso no, non ha molto senso, Solido andrebbe abstract.

    Nel tuo caso, ha senso poter creare un oggetto proprio Animale? Beh .. dipende. Per il momento lasciala pure così, come classe "concreta".

    geeno97 ha scritto:


    Il mio dubbio è su come gestire senza classe di collaudo i metodi per aggiungere o rimuovere un animale dall'insime
    Per "classe di collaudo" intendi una classe di "unit test" (con es. JUnit) o una classe con un banale main() di prova ?

    Cosa hai scritto per la classe Negozio?
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    Per classe di collaudo intendo il main().
    public class NegozioAnimali{
    private ArrayList<Cane> listaCani= new ArrayList<Cane>;
    private ArrayList<Gatto> listaGatti= new ArrayList<Gatto>;
    private int numCani;
    private int numGatti;

    public NegozioAnimali(){
    this.numCani=0;
    this.numGatti=0;
    }
    public int getNumCani(){
    return numCani;
    }
    public int getNumGatti(){
    return numGatti;
    }
    public void compraCane(Cane c){
    listaCani[numCani]= c
    numCani++;
    }
    public int vendiCane(String s){
    if(numCani>0){
    for(int i=0;i<numCani;i++){
    if(listaCani.getNome().equals(s)){
    listaCani.removeAt(i);
    return 1;
    }
    }

    }else return 0;

    }
    l'ho scritta cosi ma volevo qualcosa di più completo e preciso
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    Per classe di collaudo intendo il main().
    Ok

    geeno97 ha scritto:


    l'ho scritta cosi ma volevo qualcosa di più completo e preciso
    Innanzitutto:

    listaCani[numCani]= c
    e
    listaCani[i].removeAt(i);

    semplicemente NON hanno senso. listaCani non è un array (tipo base del linguaggio) .. ma è una collezione lista. E quindi non si usa [indice] ma il get(int indice)

    Poi numCani/numGatti sono un po' superflui perché il numero di elementi lo puoi sapere dalle liste con il size()

    Riguardo il fatto di tenere 2 liste separate per tipo, il problema non è tanto tecnico ma concettuale. Se un volessi aggiungere altri tipi .... devi aggiungere altre liste, altri metodi ecc... Diventerebbe complesso.
    Davvero devi fare così? Ti è stato chiesto espressamente di tenere separati i tipi nel negozio?
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    No non devo fare così è una mia Interpretazione. Mica potresti dirmi come gestire l'arraylist<Animale> insiemeAnimali? Ovvero come scrivere i metodi per l'aggiunta e la rimozione di un oggetto alla lista.
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    Mica potresti dirmi come gestire l'arraylist<Animale> insiemeAnimali? Ovvero come scrivere i metodi per l'aggiunta e la rimozione di un oggetto alla lista.
    Se NegozioAnimali avesse solo un ArrayList<Animale>, allora:

    1) un metodo di aggiunta es.

    public void aggiungi(Animale a)

    sarebbe banale (guarda i metodi di ArrayList).

    2) un metodo di rimozione .. dipende. Basandosi su cosa? Solo sul nome? Ti va bene che il nome è una nozione di Animale, quindi per accedere al nome non devi "sapere" di che tipo sono gli oggetti contenuti nella lista. Ma vuoi basarti solo su quello? ... o vuoi rimuovere un animale sapendo nome e tipo?
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    So che è banale ma domani ho l'esame e vorrei essere sicuro al 100%, quindi se puoi scriverlo mi faresti un grande favore.
    per quanto riguarda la rimozione si basa sul nome.
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    per quanto riguarda la rimozione si basa sul nome.
    Prova a scriverlo tu. Ti assicuro che NON è difficile. Per iterare sulla lista, sapendo che dovrai poi rimuovere, generalmente è meglio usare l'iteratore.
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    Public class NegozioAnimali2{
    private ArrayList<Animale> insiemeAnimali= new ArrayList<Aimale>();

    public NegozioAnimali(Animale animale){
    addAnimale(animale);
    }
    public NegozioAnimali( ArrayList<Animale> insiemeAnimali){
    setInsiemeAnimali();
    }
    public ArrayList<Animale> getInsiemeAnimali(){
    return insiemeAnimali;
    }
    public void setInsiemeAnimali(ArrayList<Animale> insiemeAnimali){
    this.insiemeAnimali=(ArrayList<Animale>)insiemeAnimali.clone();
    }
    public void removeAnimale(Animale animale){
    for(int i=0;i<insiemeAnimali.size();i++){
    if(animale.equals(insiemeAnimali.get(i))){
    insiemeAnimali.remove(i);
    }
    }
    }
    public void addAnimale(Animale animale){
    insiemeAnimali.add(animale);
    }
    }

    Ho provato cosi' va bene?
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    Ho provato cosi' va bene?
    C'è un errorino di scrittura su Aimale.
    Comunque:

    - Il primo costruttore (quello che riceve 1 Animale) è tecnicamente corretto anche se probabilmente non così utile.

    - Il secondo costruttore (quello che riceve un ArrayList<Animale>) non è corretto: il parametro non lo usi e invece setInsiemeAnimali lo stai invocando senza argomento.

    - addAnimale ok.

    - removeAnimale non proprio ok. Il fatto di usare equals() sull'oggetto Animale richiederebbe che in Animale (nelle sottoclassi per essere più preciso) ci sia un override appropriato di equals(Object) ma nel codice precedente non l'avevi fatto.
    Inoltre se ti basta rimuovere solo la prima occorrenza, è bene fare un break; dopo il remove perché il i++ ti farebbe comunque "saltare" un indice.

    - Sul fatto di "esporre" all'esterno la lista con getInsiemeAnimali e poterla impostare completamente con setInsiemeAnimali è discutibile, ci può stare o no ... dipende dai requisiti. Occhio che il clone() di ArrayList duplica la struttura della lista, NON duplica gli oggetti contenuti.
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    Scusami ma non ho capito come devo modificarlo. Potresti farmelo vedere tramite il codice?. Te ne sarei molto grato.
  • Re: Creazione metodi per aggiungere e rimuovere oggetto da ArrayList.

    geeno97 ha scritto:


    Scusami ma non ho capito come devo modificarlo. Potresti farmelo vedere tramite il codice?. Te ne sarei molto grato.
    Se vuoi fare una cosa semplice, è più o meno come avevi fatto prima:

    public void removeAnimale(String nome)

    Ovvero cercare l'animale per nome. Che è quasi come stavi facendo prima. Scansiona la lista, appena trovi l'indice per cui il nome è uguale (e il nome è noto in Animale, non devi sapere il tipo degli oggetti), allora fai:

    insiemeAnimali.remove(i);
    break;

    Il break è perché se fai un remove, gli elementi avanti si spostano indietro ma poi con il i++ vai a saltare comunque un elemento, quindi sarebbe un po' falsato. Se ti basta il primo trovato, ok, tutto lì.
Devi accedere o registrarti per scrivere nel forum
14 risposte