[Problemi con Java] esercizi semplici... AIUTO!

di il
1 risposte

[Problemi con Java] esercizi semplici... AIUTO!

Buona sera a tutti, mi chiamo Fabio, ho 21 anni e sono al secondo anno di Ingegneria informatica. Ho cominciato da qualche settimana il corso di Java ma sto riscontrando alcuni problemi, soprattutto a causa del passaggio da C. Vi invio il codice di esercizio completo e provo a spiegarverlo:
public class Stanza {
	private String nome;
	private Attrezzo[] attrezzi;
	private int numeroAttrezzi;
	
	public Stanza (String nome) {
		this.nome = nome;
		this.attrezzi = new Attrezzo[10]; //si impone che il numero massimo di oggetti sia 10
		this.numeroAttrezzi = 0;
	}
	
	public String getNome() {
	return this.nome;
	}
	
	//restituisce true se l'attrezzo viene aggiunto all'array
	public boolean addAttrezzo (Attrezzo attrezzo) {
		if(numeroAttrezzi<attrezzi.length) {
			this.attrezzi[numeroAttrezzi] = attrezzo;
			this.numeroAttrezzi++;
			return true;
		}
		else
			return false;
	}
	
	//restituisce true se l'oggetto cercato si trova nell'array
	public boolean hasAttrezzo (String nomeAttrezzo) {
		boolean trovato;
		trovato = false;
		for(Attrezzo attrezzo : this.attrezzi) {
			if(attrezzo.getNome().equals(nomeAttrezzo)) 
			trovato=true;
		}
		return trovato;
	}
	
	//Qui java mi da' errore, non riconosce attrezzo come tipo "Attrezzo" ma d'altronde non ho capito nemmeno bene
	//il senso del metodo da implementare
	public Attrezzo getAttrezzo(String nameAttrezzo) {
		for(Attrezzo attrezzo : this.attrezzi) {
			if(attrezzo.getNome().equals(nameAttrezzo))
				return attrezzo;
			else
				return null;
	}
}
	//Qui devo invece implementare il metodo toString() in modo da stampare la descrizione della stanza
	//e degli oggetti contenuti all'interno di essa. La mia perplessità sta nel fatto che con il metodo in questione
	//dovrei stampare l'intero array di Attrezzi, venendo dal mondo C farei semplicemente un ciclo di stampe con for
	//per ogni elemento "i" dell'array, però se uso System.out.println mi restituisce errore per over-ride.
	public String toString() {
			return "Stanza: " + this.getNome() + ". Oggetti contenuti: ";
					for(Attrezzo attrezzo : this.attrezzi) {
Definizione della classe Attrezzo:

public class Attrezzo {
	private String nome;
	private int peso;
	
	public Attrezzo (String nome, int peso) {
		this.nome = nome;
		this.peso = peso;
	}
		
	public int getPeso () {
		return peso;
	}
	
	public String getNome () {
		return nome;
	}
	public String toString() {
		return "Attrezzo " + this.getNome() + ". Peso " + this.getPeso();
	}
}
Quesiti dal professore:
? Scrivere il metodo Attrezzo getAttrezzo(String nomeAttrezzo)
che restituisca l’attrezzo di nome nomeAttrezzo se esiste, null altrimenti
? Scrivere il metodo String toString()
che restituisca una descrizione della stanza compresa una lista di tutti gli oggetti in essa contenuti

Ho aggiunto qualche commento per farvi capire il problema, spero possiate aiutarmi!

1 Risposte

  • Re: [Problemi con Java] esercizi semplici... AIUTO!

    Agerincolt ha scritto:


    Quesiti dal professore:
    ? Scrivere il metodo Attrezzo getAttrezzo(String nomeAttrezzo)
    che restituisca l’attrezzo di nome nomeAttrezzo se esiste, null altrimenti
    ? Scrivere il metodo String toString()
    che restituisca una descrizione della stanza compresa una lista di tutti gli oggetti in essa contenuti

    Ho aggiunto qualche commento per farvi capire il problema, spero possiate aiutarmi!
    La classe Attrezzo è corretta, cioè non c'è nulla di sbagliato di per sé. Quindi ok.
    La classe Stanza invece no, non è corretta/completa e richiede appunto qualche chiarimento e valutazione.

    Innanzitutto:
    - addAttrezzo è corretto.
    - hasAttrezzo è corretto (si potrebbe ottimizzare facendo restituire subito true se trovato, ma NON è affatto quello il punto/problema).

    Invece getAttrezzo e toString li devi "capire" e valutare meglio.

    Per getAttrezzo hai scritto:

    Agerincolt ha scritto:


    	public Attrezzo getAttrezzo(String nameAttrezzo) {
    		for(Attrezzo attrezzo : this.attrezzi) {
    			if(attrezzo.getNome().equals(nameAttrezzo))
    				return attrezzo;
    			else
    				return null;
    	}
    }
    A parte la non buona indentazione e il non buon uso delle graffe, si vede che c'è un for principale. Ma ci sono 2 problemi, uno concettuale e l'altro tecnico.

    Quello concettuale: se il nome lo trovi restituisci l'attrezzo, altrimenti (quel else) restituisci null. Quest'ultimo NON ha senso. Se un nome non lo trovi in un attrezzo, non vuol dire nulla subito. Non puoi restituire null, devi andare avanti a cercare.
    E il problema tecnico è che il compilatore vede che dopo il for non c'è un return. Il compilatore non può sapere cosa succede a runtime (non sa ovviamente neanche se ci saranno elementi su cui iterare). Quindi vede che il metodo è sguarnito di un return alla fine del for, ed è un errore.

    Tutto questo lo risolvi semplicemente così: se trovi il nome restituisci subito l'attrezzo. Altrimenti devi continuare nel ciclo. E solo DOPO la fine del for, allora sai che il nome non è stato trovato e quindi restituisci null. Questo è un problema più di "ragionamento", non c'entra tanto il linguaggio. Avresti avuto lo stesso dubbio/problema in C o un altro linguaggio.

    Per il toString hai scritto:

    Agerincolt ha scritto:


    	public String toString() {
    			return "Stanza: " + this.getNome() + ". Oggetti contenuti: ";
    					for(Attrezzo attrezzo : this.attrezzi) {
    Che non è completo. Ma che è comunque sbagliato. Fai un return e poi dopo un ciclo. Non ha senso.
    Se vuoi inserire tutti gli attrezzi nella stringa devi comporre una stringa concatenando tutti i dati. E poi solo alla fine restituire la stringa complessiva.
    Oppure usare Arrays.toString se ti basta la forma fornita da questo metodo (che sfrutta il toString dei tuoi oggetti Attrezzo).
Devi accedere o registrarti per scrivere nel forum
1 risposte