class Portafoglio { // Dimensione iniziale del portafoglio public static final int DIMENSIONE_INIZIALE_PORTAFOGLIO = 1; // Attributi private String nome; private double sommaInvestita; private Titolo[] elencoTitoli; private int numeroTitoli; // Costruttore: inizialmente, la somma investita è 0 e l'elenco // dei titoli in portafoglio è vuoto public Portafoglio( String nome ) { this.nome = nome; sommaInvestita = 0; elencoTitoli = new Titolo[DIMENSIONE_INIZIALE_PORTAFOGLIO]; numeroTitoli = 0; } // Interrogazione del nome public String restituisciNome() { return nome; } // Acquisto di un titolo public void acquista( Titolo t ) { // Il titolo è già in portafoglio? int pos = ricercaPosizione(t); if (pos < 0) { // Il titolo non è in portafoglio, bisogna aggiungerlo if (numeroTitoli == elencoTitoli.length) { espandiElenco(); } elencoTitoli[numeroTitoli] = t; ++numeroTitoli; } else { // (pos >= 0) // Il titolo è già in portafoglio: incremento la quantità // e la somma investita, l'elenco titoli rimane invariato int q = elencoTitoli[pos].restituisciQuantità(); elencoTitoli[pos].impostaQuantità(q + t.restituisciQuantità()); } // Aumenta la somma investita sommaInvestita += t.restituisciQuantità() * t.restituisciValore(); } // Vendo un titolo public boolean vendita( Titolo t ) { // Il titolo è in portafoglio? int pos = ricercaPosizione(t); if (pos < 0) { // Non posso vendere un titolo che non possiedo return false; } else { int qPosseduta = elencoTitoli[pos].restituisciQuantità(); if (qPosseduta < t.restituisciQuantità()) { // Non posso vendere più titoli di quelli che possiedo return false; } elencoTitoli[pos].impostaQuantità(qPosseduta - t.restituisciQuantità()); // Diminuisci la somma investita sommaInvestita -= t.restituisciQuantità() * t.restituisciValore(); return true; } } // Aggiornamento della quotazione public void aggiornaQuotazione( Titolo t ) { int pos = ricercaPosizione(t); if (pos >= 0) { elencoTitoli[pos].impostaValore(t.restituisciValore()); } } // Calcolo del numero di titoli presenti in portafoglio per tipo public int[] calcolaNumeroPerTipologia() { int[] risultato = new int[Titolo.NUMERO_TIPOLOGIE]; for (int i = 0; i < numeroTitoli; ++i) { int tipo = elencoTitoli[i].restituisciTipo(); risultato[tipo] += elencoTitoli[i].restituisciQuantità(); } return risultato; } // Calcolo del rendimento del portafoglio public double calcolaRendimento() { double valoreAttuale = 0.0; for (int i = 0; i < numeroTitoli; ++i) { valoreAttuale += elencoTitoli[i].restituisciQuantità() * elencoTitoli[i].restituisciValore(); } return (sommaInvestita - valoreAttuale); } // Metodi privati (utilizzabili solo dagli altri metodi) private void espandiElenco() { Titolo[] tmp = new Titolo[numeroTitoli * 2]; for (int i = 0; i < numeroTitoli; ++i) { tmp[i] = elencoTitoli[i]; } elencoTitoli = tmp; } private int ricercaPosizione( Titolo t ) { for( int i = 0; i < numeroTitoli; ++i) { String d = elencoTitoli[i].restituisciDenominazione(); if (d.equals(t.restituisciDenominazione())) { return i; } } return -1; } }