DOMANDA (java)dubbi Su Un Esempio Di Cui Non Ho Risoluzione

Marco Aurelio

Utente Attivo
133
11
Salve, sto studiando il linguaggio Java, dopo aver acquisito un minimo di impostazione teorica ed aver svolto alcuni semplici esercizi credo di avere una idea generale di come funzionino le cose e riesco ad interpretare delle semplici istruzioni ma non appena passo a qualcosa di più complesso come scrivere autonomamente delle istruzioni il tutto diventa più complicato, ho alcune tracce di esercizi la più semplice mi richiede:

Scrivere una classe Opera che rappresenti le informazioni codice, tipologia,opera, autore, epoca, che contenga un costruttore parametrizzato edi metodi getEpoca,getAutore...etc (fin qui ci sono)
Scrivere poi una classe Museo: (inizia la confusione)
-che rappresenti un insieme di opere d'arte tramite un array di tipo Opera,
-che contenga il costruttore parametrizzato ed un metodo "cerca" che accetta in ingresso il nome di un autore b e restituisce il numero di opere d'arte contenute nel museo aventi come autore "a".
-scrivere un metodo che restituisca i codici di tutte le opere eseguite nell'epoca "XV secolo".

Potreste fornirmi delle istruzioni per affrontare tale esercizio? Se fosse troppo lungo e complicato scrivere le istruzioni andrebbe bene anche una breve descrizione di come agire. Putroppo ancora esempi di simile complessità da cui prendere spunto non ne trovai, qualora aveste esempi o simili esercizi va bene anche un link. Grazie mille.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Fai una classe museo, crei un'array di classi Opera (non sò se si dica cosi, mai fatto java). Per il secondo punto, penso si sia sbagliato, cerchi B e ti restituisce le opere di B, sennò non ha senso. Il terzo punto semplice, fai una ricerca dentro ogni elemento dell'array riguardante l'epoca.
 
  • Mi piace
Reazioni: Marco Aurelio

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Esercizi di questo tipo saranno sicuramente presenti in numerose slide, dove si chiede di implementare la gestione di qualcosa (Museo, Libreria, Magazzino, Negozio etc.).
Comunque, visto che conosco Java, mi unisco a rodhellas:

Scrivere poi una classe Museo: (inizia la confusione)
-che rappresenti un insieme di opere d'arte tramite un array di tipo Opera,

Avrai una classe Museo, ed al suo interno un array. Questo array sarà di tipo Opera. Non so quanti elementi devi memorizzare però, ed è un dato che serve per creare l'array (ci torno tra poco).

Codice:
class Museo {
  private Opera[] opere;

  // Il costruttore ha come parametro il numero delle opere da memorizzare
  Museo(int n) {
    opere = new Opera[n];
  }

 // .......
}


-che contenga il costruttore parametrizzato ed un metodo "cerca" che accetta in ingresso il nome di un autore b e restituisce il numero di opere d'arte contenute nel museo aventi come autore "a".

Il costruttore che ti ho mostrato sopra è parametrizzato; tuttavia qui non specifica il tipo di parametro ed il motivo (potrebbe quindi essere corretto come ho supposto sopra).

Per quanto riguarda il metodo, si tratta di effettuare una ricerca nell'intero array (da 0 a opere.length), ed ottenere il nome dell'autore; questo va confrontato con il nome passato al metodo. Ricordati di utilizzare equals() per i confronti con le stringhe, in quanto == agisce sui riferimenti agli oggetti (questo vale per qualsiasi oggetto), e non sul contenuto della stringa.
Per ogni corrispondenza incrementerai una variabile, il cui valore verrà poi restituito dal metodo.

-scrivere un metodo che restituisca i codici di tutte le opere eseguite nell'epoca "XV secolo".

Qualcosa di analogo a sopra.
O restituisci una stringa concatenata, o un array.



Bada bene: nel caso degli array, ti serve sempre sapere la dimensione. Se ad esempio vuoi restituire un'array di stringhe - mi riferisco al caso dell'ultimo punto dell'esercizio - devi conoscerne la dimensione prima della ricerca stessa per poter istanziare la quantità di String corretta. Visto che tirare ad indovinare non sarebbe saggio ci sono alcune alternative:

- scorrere l'array e contare quante sono; poi scorrerlo di nuovo per popolarlo (ma è uno spreco!);
- istanziare l'array con un certo numero di elementi, magari in base alla quantità degli elementi che contiene:

Se hai 100 opere, puoi creare l'stanza iniziale dell'array dei codici con 10 elementi ad esempio.
Successivamente, quando la tua variabile contatore (che tiene traccia degli elementi trovati) sarà uguale alla dimensione dell'array, dovrai creare un array nuovo e più capiente, copiando tutti gli elementi precedenti.

- usare un ArrayList di String (o del tipo di dato che hanno i tuoi codici)

Chiaramente questo problema non si pone se conosci il numero di elementi in anticipo (ma questo tipicamente vale sempre con gli esercizi, al massimo ;) ).
 

Giacky91

Utente Attivo
793
84
CPU
Intel Core I7 - 2630QM - 2.0 GHZ
Scheda Madre
Proprietaria
HDD
500GB WD 2.5"
RAM
2 x 2GB Corsair
GPU
GeForce GT540M 1GB
Audio
Integrato
OS
Windows 10 Pro, Kali Linux 2.0
Non sapendo a priori la dimensione delle opere contenute nel museo, credo risulti più comodo l'utilizzo di un ArrayList. Cosi da fare una add semplice per aggiungere una nuova opera, senza dover creare un nuovo vettore con capienza +1 e copiare tutti i dati.
 
  • Mi piace
Reazioni: Marco Aurelio

LS1987

Utente Èlite
3,530
516
CPU
Phenom II X 4 945 @ 3 GHz
Scheda Madre
Asus M3A78-CM
HDD
Seagate 500 GB
RAM
4096 MB DDR2
GPU
nVidia GeForce 9800 GT
Audio
Integrato
Monitor
HP 21.5" 16:9
PSU
Cooler Master
Fai una classe museo, crei un'array di classi Opera (non sò se si dica cosi, mai fatto java). Per il secondo punto, penso si sia sbagliato, cerchi B e ti restituisce le opere di B, sennò non ha senso. Il terzo punto semplice, fai una ricerca dentro ogni elemento dell'array riguardante l'epoca.

Si dice array di istanze della classe opera. Giacky91 volendo si può usare anche un Vector al post dell'ArrayList.
 
  • Mi piace
Reazioni: rodhellas

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Si dice array di istanze della classe opera. Giacky91 volendo si può usare anche un Vector al post dell'ArrayList.

O array di oggetti Opera.
Comunque ho citato anche io apposta ArrayList, in quanto non conviene un Vector.
 
  • Mi piace
Reazioni: BAT

BAT

Moderatore
Staff Forum
Utente Èlite
22,923
11,563
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
volendo si può usare anche un Vector al post dell'ArrayList.
meglio di no, non ci sono esigenze di sincronizzazione su thread, in questo caso concordo che è molto meglio l'ArrayList
 
  • Mi piace
Reazioni: Giacky91

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!