Capitolo 12 - Dipartimento di Informatica

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