Capitolo 12: Vettori e array Capitolo 12 Vettori e array ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 1 Capitolo 12: Vettori e array Figura 1 Aggiungere un elemento in una posizione intermedia di un vettore ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 2 Capitolo 12: Vettori e array Figura 2 Rimuovere un elemento da una posizione intermedia di un vettore ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 3 Capitolo 12: Vettori e array File Purse.java import java.util.ArrayList; /** Un borsellino contiene una raccolta di monete. */ public class Purse { /** Costruisce un borsellino vuoto. */ public Purse() { coins = new ArrayList(); } /** Aggiunge una moneta al borsellino. @param aCoin la moneta da aggiungere */ public void add(Coin aCoin) { coins.add(aCoin); } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 4 Capitolo 12: Vettori e array /** Ispeziona il valore totale delle monete nel borsellino. @return la somma dei valori di tutte le monete */ public double getTotal() { double total = 0; for (int i = 0; i < coins.size(); i++) { Coin aCoin = (Coin)coins.get(i); total = total + aCoin.getValue(); } return total; } private ArrayList coins; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 5 Capitolo 12: Vettori e array File Purse.java import java.util.ArrayList; /** Un borsellino contiene una raccolta di monete. */ public class Purse { /** Costruisce un borsellino vuoto. */ public Purse() { coins = new ArrayList(); } /** Aggiunge una moneta al borsellino. @param aCoin la moneta da aggiungere */ public void add(Coin aCoin) { coins.add(aCoin); } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 6 Capitolo 12: Vettori e array /** Ispeziona il valore totale delle monete nel borsellino. @return la somma dei valori di tutte le monete */ public double getTotal() { double total = 0; for (int i = 0; i < coins.size(); i++) { Coin aCoin = (Coin)coins.get(i); total = total + aCoin.getValue(); } return total; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 7 Capitolo 12: Vettori e array /** Conta il numero delle monete nel borsellino. @return il numero di monete */ public int count() { return coins.size(); } /** Verifica se il borsellino contiene almeno una moneta uguale alla moneta fornita. @param aCoin la moneta da trovare @return true se c’è una moneta uguale a aCoin ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 8 Capitolo 12: Vettori e array */ public boolean find(Coin aCoin) { for (int i = 0; i < coins.size(); i++) { Coin c = (Coin)coins.get(i); if (c.equals(aCoin)) return true; // trovata } return false; // non trovata nell’intera lista } /** Conta il numero di monete nel borsellino che sono uguali alla moneta fornita. @param aCoin la moneta da trovare @return il numero di monete uguali a aCoin ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 9 Capitolo 12: Vettori e array */ public int count(Coin aCoin) { int matches = 0; for (int i = 0; i < coins.size(); i++) { Coin c = (Coin)coins.get(i); if (c.equals(aCoin)) matches++; // trovata } return matches; } /** Trova la moneta con il valore massimo. (Precondizione: Il borsellino non è vuoto) @return una moneta con il valore massimo tra quelle presenti nel borsellino ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 10 Capitolo 12: Vettori e array Coin getMaximum() { Coin max = (Coin)coins.get(0); for (int i = 1; i < coins.size(); i++) { Coin c = (Coin)coins.get(i); if (c.getValue() > max.getValue()) max = c; } return max; } private ArrayList coins; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 11 Capitolo 12: Vettori e array Figura 3 Un riferimento ad array e un array ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 12 Capitolo 12: Vettori e array Figura 4 Due riferimenti allo stesso array ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 13 Capitolo 12: Vettori e array Figura 5 Clonare un array ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 14 Capitolo 12: Vettori e array Figura 6 Il metodo System.arraycopy ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 15 Capitolo 12: Vettori e array Figura 7 Inserire un nuovo elemento in un array ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 16 Capitolo 12: Vettori e array Figura 8 Rimuovere un elemento da un array ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 17 Capitolo 12: Vettori e array Figura 9 Un array riempito solo in parte ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 18 Capitolo 12: Vettori e array Figura 10 Far crescere un array ©Apogeo 2002 19 File DataSet.java Capitolo 12: Vettori e array /** Questa classe calcola la media di un insieme di valori. */ public class DataSet { /** Costruisce un insieme di dati vuoto. */ public DataSet() { final int DATA_LENGTH = 100; data = new double[DATA_LENGTH]; dataSize = 0; } /** Aggiunge un valore all’insieme di dati. @param x un valore ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 20 Capitolo 12: Vettori e array */ public void add(double x) { if (dataSize >= data.length) { // crea un nuovo array grande il doppio double[] newData = new double[2 * data.length]; // copia tutti gli elementi da data a newData System.arrayCopy(data, 0, newData, 0, data.length); // abbandona il vecchio array e inserisci in data // un riferimento al nuovo array data = newData; } data[dataSize] = x; dataSize++; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 21 Capitolo 12: Vettori e array /** Restituisce la media dei dati inseriti. @return la media, oppure 0 se non sono stati inseriti dati */ public double getAverage() { if (dataSize == 0) return 0; double sum = 0; for (int i = 0; i < dataSize; i++) sum = sum + data[i]; return sum / dataSize; } private double[] data; private int dataSize; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 22 Capitolo 12: Vettori e array File DataSetTest.java import java.util.Random; /** Questo programma collauda la classe DataSet aggiungendo all’insieme 10000 numeri casuali e calcolandone la media. */ public class DataSetTest { public static void main(String[] args) { Random generator = new Random(); DataSet data = new DataSet(); final int COUNT = 10000; System.out.println("Adding " + COUNT + " random numbers."); for (int i = 0; i < COUNT; i++) { double x = generator.nextDouble(); data.add(x); } double average = data.getAverage(); System.out.println("average=" + average); } } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 23 Capitolo 12: Vettori e array Figura 11 Evitate gli array paralleli ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 24 Capitolo 12: Vettori e array Figura 12 Riorganizzare array paralleli in array di oggetti ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 25 Capitolo 12: Vettori e array Figura 13 Una scacchiera per il gioco “Tic-Tac-Toe” ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 26 Capitolo 12: Vettori e array File TicTacToe.java /** Una scacchiera 3x3 per il gioco tic-tac-toe. */ public class TicTacToe { /** Costruisce una scacchiera vuota. */ public TicTacToe() { board = new char[ROWS][COLUMNS]; // riempi di spazi for (int i = 0; i < ROWS; i++) for (int j = 0; j < COLUMNS; j++) board[i][j] = ' '; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 27 Capitolo 12: Vettori e array Figura 14 Vicine di una cellula nel Gioco della Vita - (Es. P12.20) ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 28 /** Capitolo 12: Vettori e array Imposta un settore della scacchiera. Il settore deve essere libero. @param i l’indice di riga @param j l’indice di colonna @param player il giocatore ('x' o 'o') */ public void set(int i, int j, char player) { if (board[i][j] != ' ') throw new IllegalArgumentException( "Position occupied"); board[i][j] = player; } /** Crea una rappresentazione della scacchiera in una stringa, come ad esempio |x o| | x | | o|. @return la stringa rappresentativa ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 29 Capitolo 12: Vettori e array */ public String toString() { String r = ""; for (int i = 0; i < ROWS; i++) { r = r + "|"; for (int j = 0; j < COLUMNS; j++) r = r + board[i][j]; r = r + "|\n"; } return r; } private char[][] board; private static final int ROWS = 3; private static final int COLUMNS = 3; } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 30 Capitolo 12: Vettori e array File TicTacToeTest.java import javax.swing.JOptionPane; /** Questo programma collauda la classe TicTacToe chiedendo all’utente di selezionare posizioni sulla scacchiera e visualizzando il risultato. */ public class TicTacToeTest { public static void main(String[] args) { char player = 'x'; TicTacToe game = new TicTacToe(); while (true) ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 31 Capitolo 12: Vettori e array { System.out.println(game); // invoca game.toString() String input = JOptionPane.showInputDialog( "Row for " + player + "(Cancel to exit)"); if (input == null) System.exit(0); int row = Integer.parseInt(input); input = JOptionPane.showInputDialog( "Column for " + player); int column = Integer.parseInt(input); game.set(row, column, player); if (player == 'x') player = 'o'; else player = 'x'; } } } ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 32 Capitolo 12: Vettori e array Figura 15 Configurazione “aliante” (Es. P12.20) ©2002 Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2 33 Capitolo 12: Vettori e array Figura 16 Configurazione spara alianti (Es. P12.20) ©2002 Apogeo 34