Array

Scrivi il programma RantedChessBoard che riceve N interi come argomenti da linea di comando e crea una matrice ranted contenente N righe. Ogni riga possiede la lunghezza definita dal rispettivo argomento. La matrice va poi riempita a scacchiera, ossia con un’alternanza di 0 e 1.

Ad esempio gli argomenti "1 3 2" producono una matrice di 3 righe in cui la prima ha dimensione 1, la seconda 3 e la terza 2:

0 
1 0 1 
0 1 

Per "7 5 4 3 2 8" si ottiene invece:

0 1 0 1 0 1 0 
1 0 1 0 1 
0 1 0 1 
1 0 1 
0 1 
1 0 1 0 1 0 1 0 

E per "1 2 3 4 5 6 7 2 2 2":

0 
1 0 
0 1 0 
1 0 1 0 
0 1 0 1 0 
1 0 1 0 1 0 
0 1 0 1 0 1 0 
1 0 
0 1 
1 0 

Scrivi il programma MediaArray che:

  1. Crea un array di double di dimensione 50
  2. Riempie l’array con 50 valori casuali compresi nell’intervallo [-10.0; 10.0]
  3. Stampa il contenuto dell’array
  4. Calcola la media dei valori contenuti nell’array
  5. Stampa a terminale la media

Scrivi il programma TrovaMassimo che:

  1. Crea un array di interi di dimensione 100
  2. Riempie l’array con 100 valori casuali compresi nell’intervallo [-100; 0]
  3. Stampa il contenuto dell’array
  4. Trova il valore massimo contenuto nell’array
  5. Stampa a terminale il massimo

Scrivi il programma TrovaMinimo che:

  1. Crea un array di interi di dimensione 100
  2. Riempie l’array con 100 valori casuali compresi nell’intervallo [0; 100]
  3. Stampa il contenuto dell’array
  4. Trova il valore minimo contenuto nell’array
  5. Stampa a terminale il minimo

Int2Day array Livello 9

Scrivi il programma Int2Day che riceve un intero come argomento da linea di comando e stampa il nome del giorno della settimana corrispondente, secondo l’associazione definita nella tabella seguente:

numero elemento
1 "lunedì"
2 "martedì"
3 "mercoledì"
4 "giovedì"
5 "venerdì"
6 "sabato"
7 "domenica"

Per argomenti non appropriati o al di fuori dell’intervallo consentito, il programma stampa "Valore non valido.".

Scrivi la classe PerfectNumber utile per individuare i numeri perfetti. La classe deve esportare i metodi seguenti:

  • public static boolean isPerfect(int n): ritorna true se n è un numero perfetto, false altrimenti

  • public static boolean isDefective(int n): ritorna true se n è un numero difettivo, false altrimenti

  • public static int[] getDividers(int n): ritorna un array contenente l’elenco dei divisori propri di n

  • public static long getDividersSum(int[] dividers): ritorna la somma dei numeri contenuti nell’array dividers

  • public static int[] getPerfectNumbers(int min, int max): ritorna un array contenente l’elenco dei numeri perfetti presenti nell’intervallo [min, max]

  • public static int[] getDefectiveNumbers(int min, int max): ritorna un array contenente l’elenco dei numeri difettivi presenti nell’intervallo [min, max]

  • public static int[] getAbundantNumbers(int min, int max): ritorna un array contenente l’elenco dei numeri abbondanti presenti nell’intervallo [min, max]

Numeri perfetti

Un numero N è detto perfetto se la somma dei suoi divisori propri (positivi, N escluso) è pari ad N. Ad esempio 28 è un numero perfetto perché sommando i suoi divisori propri (1, 2, 4, 7 e 14) si ottiene 28.

Invece se la somma dei divisori di N è inferiore al suo valore, N è un numero difettivo, mentre se le somma dei divisori è superiore, N è un numero abbondante.

Scrivi il programma Scacchiera che, dati due numeri interi forniti come argomenti da linea di comando che rappresentano il numero di righe e il numero di colonne di una matrice:

  1. Crea una matrice con le dimensioni definite dall’utente
  2. Riempie la matrice disponendo i valori 1 e 0 altrenati come su una scacchiera.

Esempio, per una matrice 5 x 5:

0 1 0 1 0 
1 0 1 0 1 
0 1 0 1 0 
1 0 1 0 1 
0 1 0 1 0

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio:

0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0

Scrivi il programma Scacchiera che:

  1. Chiede all’utente di introdurre il numero di righe e il numero di colonne di una matrice
  2. Crea una matrice con le dimensioni definite dall’utente
  3. Riempie la matrice disponendo i valori 1 e 0 altrenati come su una scacchiera.

Esempio, per una matrice 5 x 5:

Inserire numero di righe: 5
Inserire numero di colonne: 5

0 1 0 1 0 
1 0 1 0 1 
0 1 0 1 0 
1 0 1 0 1 
0 1 0 1 0

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio:

Inserire numero di righe: 6
Inserire numero di colonne: 8

0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0

MinMax array Livello 10

Scrivi il programma MinMax che:

  1. Crea una matrice di interi di dimensioni 8 x 8
  2. Riempie la matrice con 64 valori casuali compresi nell’intervallo [0; 100]
  3. Stampa il contenuto della matrice
  4. Trova il valore massimo contenuto nella matrice
  5. Trova il valore minimo contenuto nella matrice
  6. Stampa a terminale il massimo e minimo

Esempio:

14	29	59	88	21	27	14	26	
19	49	54	76	43	36	76	79	
92	71	12	63	8	85	64	43	
18	9	53	95	68	55	7	8	
97	11	37	8	5	43	2	96	
43	76	63	90	94	42	76	98	
82	91	3	81	9	48	66	32	
56	54	62	35	7	75	12	19	

Min: 2
Max: 98

Scrivi la classe ArrayComparator contenente i metodi seguenti:

public static boolean isLonger(char[] a, char[] b)

Ritorna true se la dimensione dell’ array a è superiore a quella di b, false altrimenti.

public static char[] append(char c, char[] a)

Aggiunge il carattere c in coda ad a e ritorna l’array risultante.

public static boolean onlyContainsVowels(char[] a)

Ritorna true se l’array a contiene esclusivamente vocali, altrimenti ritorna false.

public static char[] compare(char[] a, char[] b)

Ritorna un array contenente l’elenco di vocali di a che si trovano nella stessa posizione dentro a b:

  • se a contiene 'i', 'u', 'A'
  • e b contiene 'i', 'a', 'a', 'u'
  • ritorna un array contenente 'i', 'A'

Se a contiene caratteri non validi, solleva una IllegalArgumentException con il messaggio:

	"Array a non valido"

Se b contiene caratteri non validi, solleva una IllegalArgumentException con il messaggio:

	"Array b non valido"

Se b è più piccolo di a, solleva una IllegalArgumentException con il messaggio:

	"Array b troppo piccolo"	

Scrivi la classe ArrayDecoder contenente i metodi seguenti:

public static boolean sizeDiffer(char[] a, char[] b)

Ritorna true se la dimensione degli array a e b è differente, false altrimenti.

public static int indexOfUnique(char[] a, char c)

Se il carattere c è presente una sola volta nell’array a, il metodo ritorna l’indice di c in a. Altrimenti ritorna -1.

public static boolean isPermutation(char[] a, char[] b)

Ritorna true solo se l’array b è una permutazione valida dell’array a, ossia se ogni carattere di b è presente una sola volta in a (anche in posizioni diverse).

public static int[] decode(char[] a, char[] b)

Ritorna un array che contiene l’indice in cui ogni carattere di a è presente dentro a b. Ad esempio:

  • se a contiene 'a', 'b', 'c'
  • e b contiene 'b', 'a', 'c'
  • ritorna un array contenente 1, 0, 2

Se le dimensioni di a e b sono diverse, solleva una IllegalArgumentException con il messaggio:

	"Lunghezze diverse"

Se b non è una permutazione valida di a solleva una IllegalArgumentException con il messaggio:

	"Array b non valido"

Scrivi la classe ArrayEncoder contenente i metodi seguenti:

public static boolean sizeEquals(char[] c, int[] p)

Ritorna true se la dimensione degli array c e p equivale, false altrimenti.

public static boolean contains(int[] p, int value)

Ritorna true se l’array p contiene il valore value, false altrimenti.

public static boolean isValid(int[] p)

Ritorna true solo se l’array p contiene tutti i numeri compresi nell’intervallo [0;p.length[.

public static char[] encode(char[] c, int[] p)

Ritorna un array in cui ogni carattere di c si trova nella posizione specificata dal rispettivo valore in p. Ad esempio:

  • se c contiene 'a', 'b', 'c'
  • e p contiene 2, 0, 1
  • ritorna un array contenente 'b', 'c', 'a'

Se le dimensioni di c e p non sono uguali, solleva una IllegalArgumentException con il messaggio:

	"Dimensione diversa"

Se p contiene dei valori non validi, solleva una IllegalArgumentException con il messaggio:

	"Indici non validi"

Scrivi il programma VerticalCrossword contenente i metodi utili per trovare delle parole nascoste nelle colonne di una matrice.

La classe VerticalCrossword deve contenere i metodi seguenti:

public static int getMaxWidth(char[][] table)

Ritorna la dimensione della riga più larga (con il maggior numero di colonne) contenuta nella matrice table.

public static String getColAsString(char[][] table, int col)

Ritorna la stringa ottenuta concatenando tutti i caratteri presenti nella colonna col della matrice table. Le righe troppo corte per possedere un carattere nella colonna specificata da col vengono ignorate. Ad esempio, per la matrice seguente e per col pari a 3, il metodo ritorna la stringa "CaNe":

c C e C c
c a n a a
c p a N n E
a e e
a b c e e

public static int searchInCols(char[][] table, String word)

Ritorna l’indice della colonna della matrice table che contiene la parola word (non sensibile al caso dei caratteri). Se word è presente in più colonne, ritorna l’indice della prima ricorrenza. Se nessuna colonna di table contiene word, ritorna -1.

Ad esempio per la parola "cane" e la matrice seguente il metodo ritorna 3:

c C e C c
c a n a a
c p a N n E
a e e
a b c e e

Mentre per questa matrice e "BAU" ritorna 1:

G a t t o
r b a u
R A p U n Z
r u p

main

Contiene il codice utile a verificare e dimostrare il buon funzionamento di tutti i metodi che hai scritto.

Scrivi il programma HorizontalCrossword contenente i metodi utili per trovare delle parole nascoste nelle righe di una matrice.

La classe HorizontalCrossword deve contenere i metodi seguenti:

public static String reverse(String word)

Ritorna la stringa word rovesciata, ad esempio per "cane" ritorna "enac".

public static String getRowAsString(char[][] table, int row)

Ritorna la stringa ottenuta concatenando tutti i caratteri presenti nella riga row della matrice table.

public static int searchInRows(char[][] table, String word)

Ritorna l’indice della riga della matrice table che contiene la parola word (regolare o rovesciata, non sensibile al caso dei caratteri). Se word è presente in più righe, ritorna l’indice della prima ricorrenza. Se nessuna riga di table contiene word, ritorna -1.

Ad esempio per la parole “cane” e la matrice seguente il metodo ritorna 1:

c C e a c
c A n E a
o N i s N E
b E e
g a t t E

Mentre per questa ritorna 3:

t O p o C a N
F r o g
T a n A r
e N A c i o S
A g u L e B
B o V e

main

Contiene il codice utile a verificare e dimostrare il buon funzionamento di tutti i metodi che hai scritto.

Scrivi il programma MatrixMerger contenente i metodi utili per combinare tra loro due matrici di interi.

La classe MatrixMerger deve contenere i metodi seguenti:

public static int getRowWidth(int[][] m, int row)

Ritorna la larghezza (il numero di colonne) della riga row nella matrice m. Se la riga specificata è vuota oppure non è valida, ritorna 0.

public static int getMaxWidth(int[][] a, int[][] b)

Ritorna la dimensione della riga più larga che si otterrebbe combinando ogni riga di a con la rispettiva riga di b. Ossia, calcola la somma tra la dimensione di ogni riga della matrice a con la rispettiva riga della matrice b e ritorna il valore massimo.

public static int[][] merge(int[][] a, int[][] b)

Ritorna una matrice rettangolare ottenuta combinando le matrici a e b. La combinazione avviene concatenando ogni riga di a con la rispettiva riga di b. La nuova matrice avrà un numero di righe pari a quello della matrice più alta tra a e b ed un numero di colonne pari a quella della riga più larga prodotta dalla concatenazione (larghezza massima di a e b). Ad esempio:

1 2 3 4 5 6 1 2 3 4 5 6
1 2 3 4 + 5 6 = 1 2 3 4 5 6
1 2 3 4 5 6 1 2 3 4 5 6

Se presenti, le celle in eccesso di ogni riga conterranno il valore 0, ad esempio:

1 1 1 5 5 5 1 1 1 5 5 5
2 2 2 + 6 6 6 = 2 2 2 6 6 6
3 7 7 7 7 3 7 7 7 7 0
4 4 4 4 4 4 4 4 0 0

main

Contiene il codice utile a verificare e dimostrare il buon funzionamento di tutti i metodi che hai scritto.

Scrivi la classe SearchLast che applica una ricerca sequenziale per trovare l’ultima ricorrenza di args[0] in args[1;N] e ne stampa l’indice (partendo da 0). Ad esempio:

$ java SearchLast 3 1 7 5 9 67 4 7 3 7 9
7

Oppure:

$ java SearchLast 1 1 2 1 3 1 4 
4

Se il valore cercato non è presente il programma stampa il messaggio "Valore non trovato".

Scrivi la classe SearchFirst che applica una ricerca sequenziale per trovare la prima ricorrenza di args[0] in args[1;N] e ne stampa l’indice (partendo da 0). Ad esempio:

$ java SearchFirst 3 1 7 5 9 67 4 7 3 7 9
7

Oppure:

$ java SearchFirst 1 1 2 1 3 1 4 
0

Se il valore cercato non è presente il programma stampa il messaggio "Valore non trovato".

MatriceLRTD array Livello 12

Scrivi un programma che:

  1. Crea una matrice con le dimensioni definite dall’utente
  2. Riempie la matrice disponendo dei valori crescenti da sinistra a destra, dall’alto verso il basso.
  3. Stampa lo stato della matrice

Esempio, per una matrice di 5 x 5:

0	1	2	3	4	
5	6	7	8	9	
10	11	12	13	14	
15	16	17	18	19	
20	21	22	23	24	

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio (7 x 2):

0	1	
2	3	
4	5	
6	7	
8	9	
10	11	
12	13	

Quando hai finito, prova a risolvere questo esercizio e i successivi senza usare variabili di supporto per gestire il valore crescente (usando solo le variabili i e j).

Scrivi la classe SortMachine contenente i metodi descritti in seguito.

  • public static int getRandomInt(int min, int max): ritorna un numero intero casuale nel range [min;max].
  • public static void randomize(int[] a, int min, int max): riempie l’array a di numeri casuali nel range [min;max].
  • public static void swap(int[] a, int i, int j): se esistenti, scambia i valori dei due elementi di a che si trovano in i e j.
  • public static boolean isSorted(int[] a): ritorna true se l’array a è ordinato (crescente), false altrimenti.
  • public static void bubbleSort(int[] a): ordina gli elementi di a in modo crescente applicando l’algoritmo bubble sort.
  • public static void selectionSort(int[] a): ordina gli elementi di a in modo crescente applicando l’algoritmo selection sort.

Poi verifica il buon funzionamento dei metodi e confronta le prestazioni di bubble e selection sort cronometrando quanto tempo impiegano per ordinare un array di 10000 elementi.

Scrivi la classe BinarySearch che applica una ricerca binaria per trovare args[0] nell’insieme ordinato rappresentato da args[1;N] e ne stampa l’indice (partendo da 0). Ad esempio:

$ java BinarySearch 3 1 2 3 5 7 8 10
2

Se il valore cercato non è presente il programma stampa il messaggio "Valore non trovato".

MatriceTDLR array Livello 13

Ora prova riempire una matrice colonna per colonna. Scrivi un programma che:

  1. Crea una matrice con le dimensioni definite dall’utente
  2. Riempie la matrice disponendo dei valori crescenti dall’alto verso il basso, da sinistra a destra
  3. Stampa lo stato della matrice

Esempio, per una matrice di 5 x 5:

0	5	10	15	20	
1	6	11	16	21	
2	7	12	17	22	
3	8	13	18	23	
4	9	14	19	24	

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio per 7 x 2:

0	7	
1	8	
2	9	
3	10	
4	11	
5	12	
6	13		

MatriceRLDT array Livello 13

Ora proviamo a ribaltare verticalmente e orizzontalmente la disposizione dei valori rispetto a quanto fatto nell’esercizio MatriceLRTD. Scrivi un programma che:

  1. Crea una matrice con le dimensioni definite dall’utente
  2. Riempie la matrice disponendo dei valori crescenti da destra a sinistra, dal basso verso l’alto
  3. Stampa lo stato della matrice

Esempio, per una matrice di 5 x 5:

24	23	22	21	20	
19	18	17	16	15	
14	13	12	11	10	
9	8	7	6	5	
4	3	2	1	0	

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio, per 7 righe e 2 colonne:

13	12	
11	10	
9	8	
7	6	
5	4	
3	2	
1	0	

MatriceLRDT array Livello 13

Ora proviamo a ribaltare verticalmente la disposizione dei valori rispetto a quanto fatto nell’esercizio MatriceLRTD. Scrivi un programma che:

  1. Crea una matrice con le dimensioni definite dall’utente
  2. Riempie la matrice disponendo dei valori crescenti da sinistra a destra, dal basso verso l’alto
  3. Stampa lo stato della matrice

Esempio, per una matrice di 5 x 5:

20	21	22	23	24	
15	16	17	18	19	
10	11	12	13	14	
5	6	7	8	9	
0	1	2	3	4	

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio (7 x 2):

12	13	
10	11	
8	9	
6	7	
4	5	
2	3	
0	1		

MatriceRLTD array Livello 13

Ora proviamo a ribaltare orizzontalmente la disposizione dei valori rispetto a quanto fatto nell’esercizio MatriceLRTD. Scrivi un programma che:

  1. Crea una matrice con le dimensioni definite dall’utente
  2. Riempie la matrice disponendo dei valori crescenti da destra a sinistra, dall’alto verso il basso.
  3. Stampa lo stato della matrice

Esempio, per una matrice di 5 x 5:

4	3	2	1	0	
9	8	7	6	5	
14	13	12	11	10	
19	18	17	16	15	
24	23	22	21	20	

Il programma deve funzionare correttamente anche per matrici rettangolari. Esempio (7 x 2):

1	0	
3	2	
5	4	
7	6	
9	8	
11	10	
13	12	

NameSorter

Crea la classe NameSorter che dato un elenco di nomi forniti come argomenti da linea di comando, li ordina alfabeticamente. A tale scopo la classe deve contenere il metodo:

public static void sortNames(String[] names)

Che ordina l’array names fornito come parametro.

Alla fine il programma deve stampare i nomi in ordine alfabetico, esempio:

$ java NameSorter Zorro Luca Andrea Antonio
Andrea 
Antonio
Luca
Zorro

Scrivere il programma PacNum contenente il metodo:

void step(int[][] m)

Tale metodo, data la matrice m (di qualsiasi dimensione valida):

  1. controlla che i valori contenuti nella matrice rispettino le regole seguenti (altrimenti termina senza fare nulla):
    • controlla che tutti gli elementi di m tranne uno (che chiameremo X) siano pari a 0
    • X deve avere un valore compreso nel range [1;4]
  2. Se la matrice rispetta le regole, ne modifica il contenuto nel modo seguente:
    • se X vale 1, lo sposta in alto (in su di una riga), se X si trova nella prima riga, lo sposta nell’ultima
    • se X vale 2, lo sposta in basso (in giù di una riga), se X si trova nella ultima riga, lo sposta nella prima
    • se X vale 3, lo sposta a sinistra (a sinistra di una colonna), se X si trova nella prima colonna, lo sposta nell’ultima
    • se X vale 4, lo sposta a destra (a destra di una colonna), se X si trova nella ultima colonna, lo sposta nella prima

Esempio:

0	0	0				0	1	0
0	1	0 	-> diventa ->		0	0	0
0	0	0				0	0	0

Oppure:

0	0	0				0	0	0
0	0	3	-> diventa ->		0	3	0
0	0	0				0	0	0

Oppure:

0	0	0				0	0	0
3	0	0	-> diventa ->		0	0	3
0	0	0				0	0	0

Wallet class array Livello 15

Per un app di gestione dei prestiti personali devi implementare le classi seguenti:

Classe Person

Rappresenta una persona (creditore o debitore). Un oggetto Person è caratterizzato da un nome costituito da una stringa contenente una lettera maiuscola seguita almeno 2 lettere minuscole (ad esempio "Alb") e memorizzato nell’attributo name (read only). La classe Person deve esportare:

  • Person(String name): è il costruttore, se il nome name non è valido solleva una IllegalArgumentException con il messaggio:

      "Invalid name <name>"
    
  • String toString(): ritorna la rappresentazione testuale contenente il nome della persona.

  • boolean equals(Person p): ritorna true se la persona corrente possiede lo stesso nome della persona p, false altrimenti.

Inoltre deve contenere il metodo package private:

  • boolean isNameValid(String name): ritorna true se name è un nome di persona valido, false altrimenti.

Classe Loan

Rappresenta una voce dell’elenco di prestiti contenuto in un Wallet. Lo stato di un Loan è caratterizzato da una persona (Person, read only) e dal relativo bilancio (double amount, read-write, default 10). Un bilancio positivo rappresenta un credito, uno negativo un debito. Inoltre Loan deve esportare i metodi seguenti:

  • Loan(Person person, double amount): costruttore, istanzia un Loan associato alla persona person con una somma definita da amount. La somma deve essere diversa da 0, in caso contrario viene applicato il valore di default.

  • Loan(Person person): costruttore, istanzia un Loan associato alla persona person con la somma di default.

  • String toString(): ritorna la rappresentazione testuale del Loan nel formato:

      "<segno><amount> <name>"   ad esempio `"+3.0 Alb"`.
    

Classe Wallet

Rappresenta un portafoglio dei prestiti e deve esportare i metodi seguenti:

  • Wallet(): costruttore, istanzia un portafoglio vuoto.

  • int indexOf(Person person): ritorna l’indice del Loan associato alla persona person nell’elenco loans. Se non ne trova nessuno ritorna -1.

  • void addLoan(Person person, double amount) : se nel portafoglio non è già presente un Loan associato a person, aggiunge al portafoglio un nuovo Loan. In caso contrario ne aggiorna il bilancio. Se il bilancio aggiornato è pari a 0, il Loan viene rimosso dal portafogli.

  • String toString(): ritorna una stringa contenente l’elenco di Loan presenti nel portafoglio secondo il formato illustrato nell’esempio seguente:

          +2.0 Alb
          -1.0 Mike
    

Inoltre deve contenere il metodo package private:

  • void removeLoan(int index): rimuove dal portafoglio il Loan all’indice index.

Per un sistema di acquisti online devi implementare le classi seguenti:

Classe Article

Rappresenta un articolo in vendita nel negozio. Un Article è caratterizzato da un codice di prodotto costituito da una stringa contenente una lettera maiuscola seguita da 4 cifre (ad esempio "A1234") e memorizzato nell’attributo code (read only). La classe Article deve esportare:

  • Article(String code): è il costruttore, se il codice code non è valido solleva una IllegalArgumentException con il messaggio:

      "Invalid article code <code>"
    
  • String toString(): ritorna la rappresentazione testuale dell’articolo nel formato:

      "Article code <code>"
    
  • boolean equals(Article a): ritorna true se l’articolo corrente possiede lo stesso codice dell’articolo a, false altrimenti.

Inoltre deve contenere il metodo package private:

  • boolean isCodeValid(String code): ritorna true se code è un codice di articolo valido, false altrimenti.

Classe Item

Rappresenta una voce dell’elenco contenuto in un ShoppingCart. Lo stato di un Item è caratterizzato da un articolo (Article, read only) e dalla relativa quantità (int quantity, read-write, valore minimo 1, default 1). Inoltre deve esportare i metodi seguenti:

  • Item(int quantity, Article article): costruttore, istanzia un Item associato all’articolo article nella quantità definita da quantity. La quantità deve essere superiore a 0, in caso contrario viene applicato il valore di default.

  • Item(Article article): costruttore, istanzia un Item associato all’articolo article nella quantità di default.

  • String toString(): ritorna la rappresentazione testuale del Item nel formato:

      "Article code <code> (<quantity>)"   ad esempio `"Article code A1234 (2)"`.
    

Classe ShoppingCart

Rappresenta un carrello degli acquisti e deve esportare i metodi seguenti:

  • ShoppingCart(): costruttore, istanzia un carrello vuoto.

  • int indexOf(Article article): ritorna l’indice del Item associato all’articolo article nell’elenco items. Se non ne trova nessuno ritorna -1.

  • void addArticle(Article article): se nel carrello è già presente un Item associato all’articolo article, ne incrementa la quantità. In caso contrario aggiunge al carrello un nuovo Item associato all’articolo article.

  • void removeArticle(Article article): se nel carrello è presente un Item associato all’articolo article, ne decrementa la quantità. Se la quantità decrementata è pari a 0, l’Item viene rimosso dal carrello.

  • String toString(): ritorna una stringa contenente l’elenco di Item presenti nel carrello secondo il formato illustrato nell’esempio seguente:

          - Article code A1234 (2)
          - Article code B7254 (1)