Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Giorgio Bruno
Dip. Automatica e Informatica Politecnico di Torino Tel. 011 5647003, email: giorgio.bruno@polito.it Parte 1 aggiornata
G. Bruno
Slide 1
Java is Object-oriented
Java
Safe
Robust Network-enabled
Graphical
Multithreaded Distributed
Platform independent
http://java.sun.com/developer/onlineTraining/index.html
G. Bruno
Slide 2
Argomenti
Caratteristiche di base Inheritance, interfacce, JDK Collezioni
Gestione eccezioni
I/O e file Grafica, swing Applet e thread Esempi Testo consigliato: K. Arnold, J. Gosling, D. Holmes, Il linguaggio Java Manuale ufficiale. Pearson, 2006.
JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html
G. Bruno
Slide 3
Interazione tra due oggetti: nello svolgimento di una sua operazione un oggetto pu richiedere l'esecuzione di un'operazione (con eventuali parametri) da parte di un altro oggetto; il chiamante aspetta la conclusione.
Un oggetto conosce un altro oggetto o perch gli viene passato come parametro di un'operazione o perch ha un'associazione con esso. Si possono stabilire associazioni (legami) tra oggetti. Si dice navigazione il muoversi da un oggetto ad altri oggetti seguendo le loro associazioni.
G. Bruno
Slide 4
package g; public class Point0a { private int x,y; public Point0a(int a, int b) {x = a; y = b;} public void move(int a, int b) {x = a; y = b;} public String toString(){return "x = " + x + " y = " + y;} } package testG; import g.*; public class TestPoint0a { public static void main(String[] args) { Point0a p = new Point0a(10,20); p.move(100, 200); System.out.println(p); // x = 100 y = 200 } }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Classe + test
Slide 5
classe Point0
package g; public class Point0 { private int x,y;
}
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 6
- Object-Based (Ada). The language has specific constructs to manage objects - Class-Based (CLU). + each object belongs to a class - Object-Oriented (Simula, Smalltalk). + classes support inheritance - Strongly-Typed Object-Oriented (C++, Java, C#). + the language is strongly typed
G. Bruno
Slide 7
Java application
Using a text editor, create a file named HelloWorldApp.java with the following Java code:
class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); //Display } }
the string.
G. Bruno
Slide 8
Java application
Compile the source file using the Java compiler. If the compilation succeeds, the compiler creates a file named HelloWorldApp.class in the same directory (folder) as the Java source file (HelloWorldApp.java). This class file contains Java bytecodes, which are platform-independent codes interpreted by the Java runtime system. Run the program using the Java interpreter.
G. Bruno
Slide 9
Java application
class HelloWorldApp1 { public static void main(String[] args) { System.out.println("Hello " + args[0]); } }
G. Bruno
Slide 10
http://www.eclipse.org/downloads/ (classic)
Eclipse
G. Bruno
Slide 11
The BasicsDemo program that follows adds the numbers from 1 to 10 and displays the result. public class BasicsDemo { public static void main(String[] args) { int sum = 0; for (int current = 1; current <= 10; current++) { sum += current; } System.out.println("Sum = " + sum); } } The output from this program is:
Sum = 55
G. Bruno
Slide 12
Variables
When you declare a variable, you explicitly set the variable's name and data type. The Java programming language has two categories of data types: primitive and reference. A variable of primitive type contains a value. This table shows all of the primitive data types along with their sizes and formats:
G. Bruno
Slide 13
Keyword
Size/Format 8-bit two's complement 16-bit two's complement 32-bit two's complement
(integers)
byte short int
long
(real numbers) float double (other types) char boolean
Long integer
Single-precision floating point Double-precision floating point A single character A boolean value (true or false)
G. Bruno
Slide 14
The location of a variable declaration implicitly sets the variable's scope, which determines what section of code may refer to the variable by its simple name. There are four categories of scope: member variable scope, local variable scope, parameter scope, and exception-handler parameter scope. You can provide an initial value for a variable within its declaration by using the assignment operator (=). You can declare a variable as final. The value of a final variable cannot change after it's been initialized.
G. Bruno
Slide 15
int anInt = 4; Literal 178 8864L 37.266 37.266D 87.363F 26.77e3 ' c' true false Data Type int long double double float double char boolean boolean
G. Bruno
Slide 16
Operator + * / % ++ ++ ---
Use op1 + op2 op1 - op2 op1 * op2 op1 / op2 op1 % op2 op++ ++op op---op
Description Adds op1 and op2 Subtracts op2 from op1 Multiplies op1 by op2 Divides op1 by op2
Arithmetic operators
Computes the remainder of dividing op1 by op2 Increments op by 1; evaluates to the value of op before it was incremented
Increments op by 1; evaluates to the value of op after it was incremented Decrements op by 1; evaluates to the value of op before it was decremented Decrements op by 1; evaluates to the value of op after it was decremented
G. Bruno
Slide 17
Relational operators
Operator > >= < <= == Use Returns true if op1 is greater than op2 op1 is greater than or equal to op2 op1 is less than op2 op1 is less than or equal to op2 op1 and op2 are equal op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2
!=
op1 != op2
You can use the following conditional operators to form multi-part decisions.
G. Bruno
Slide 18
Operator
Use
Returns true if
&&
|| ! &
|
^
op1 | op2
op1 ^ op2
G. Bruno
Slide 19
Operator Use
>> << >>> & | op1 >> op2 op1 << op2 op1 >>> op2 op1 & op2 op1 | op2
Operation
shift bits of op1 right by distance op2 shift bits of op1 left by distance op2 shift bits of op1 right by distance op2 (unsigned) Operation bitwise and bitwise or
Operator Use
^
~
op1 ^ op2
~op2
bitwise xor
bitwise complement
G. Bruno
Slide 20
Operator
Use
Equivalent to
+=
-= *= /= %= &= |=
op1 += op2
op1 -= op2 op1 *= op2 op1 /= op2 op1 %= op2 op1 &= op2 op1 |= op2
Assignment
^=
<<= >>= >>>=
op1 ^= op2
op1 <<= op2 op1 >>= op2
G. Bruno
Slide 21
?: [] [] [] . () (type)
op1 ? op2 : op3 type [] type[op1] op1[op2] op1.op2 op1(params) (type) op1
If op1 is true, returns op2. Otherwise, returns op3. Declares an array of unknown length, which contains type elements.
Creates an array with op1 elements. Must be used with the new operator. Accesses the element at op2 index within the array op1. Indices begin at 0.
Is a reference to the op2 member of op1. Declares or calls the method named op1 with the specified parameters. Casts (converts) op1 to type.
new
new op1
instanceof
G. Bruno
Slide 22
Control statements
while (boolean expression) { statement(s) } do { statement(s) } while (expression); for (initialization ; termination ; increment) { statement(s) }
G. Bruno
Slide 23
package g; public class Point0a { private int x,y; public Point0a(int a, int b) {x = a; y = b;} public void move(int a, int b) {x = a; y = b;} public String toString(){return "x = " + x + " y = " + y;} } Modificare in modo che il package testG; main: generi i punti import g.*; p1(10,20) e p2(30,40), public class TestPoint0a { calcoli il punto somma p3, public static void main(String[] args) { lo trasli di 5 lungo x e di Point0a p = new Point0a(10,20); 15 lungo y, e stampi p3. p.move(100, 200); System.out.println(p); // x = 100 y = 200 } }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Classe + test
Slide 24
Esempi
classi g.Point, g.Rectangle, testG.TestG
G. Bruno
Slide 25
package g;
class Point
G. Bruno
Slide 26
package g; public class Rectangle { private int width = 20; private int height = 10; private Point origin = null; public Rectangle() {origin = new Point(0, 0);}
class Rectangle
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 27
package testG;
import g.*;
public class TestG { public static void main(String[] args) { Point p1 = new Point(23, 94); p1.move(10,20);
class TestG
System.out.println(p1.getX()); // 23
System.out.println(p1); // x = 10 y = 20
r1.move(10,20);
System.out.println(r1); // x = 10 y = 20 w = 100 h = 200 System.out.println(r1.area()); // 20000 }}
G. Bruno
Slide 28
Packages
To make classes easier to find and use, to avoid naming conflicts, and to control access, programmers bundle groups of related classes into packages. Definition: A package is a collection of related classes and interfaces that provides access protection and namespace management. To create a package, you simply put a class or interface in it. To do this, you put a package statement at the top of the source file in which the class or interface is defined. For example, the following code appears in the source file Circle.java and puts the Circle class in the graphics package: package graphics; public class Circle extends Graphic implements Draggable {
G. Bruno
Slide 29
Packages
However, if you are trying to use a member from a different package and that package has not been imported, then you must use the member's long name, which includes the package name. This is the long name for the Rectangle class declared in the graphics package in the previous example: graphics.Rectangle To import a specific member into the current file, put an import statement at the beginning of your file before any class or interface definitions (but after the package statement, if there is one). Here's how you would import the Circle class from the graphics package created in the previous section: import graphics.Circle; Now you can refer to the Circle class by its short name: Circle myCircle = new Circle(); import graphics.*;
G. Bruno
Slide 30
protected
public (package)
X
X X
X
X
X
X X X
G. Bruno
Slide 31
Garbage collection
An object is eligible for garbage collection when there are no more references to that object. References that are held in a variable are usually dropped when the variable goes out of scope. Or, you can explicitly drop an object reference by setting the variable to the special value null. Remember that a program can have multiple references to the same object; all references to an object must be dropped before the object is eligible for garbage collection. The Java runtime environment has a garbage collector that periodically frees the memory used by objects that are no longer referenced. The garbage collector does its job automatically, although, in some situations, you may want to run the garbage collection explicitly by calling the gc method in the System class. For instance, you might want to run the garbage collector after a section of code that creates a large amount of garbage or before a section of code that needs a lot of memory. Before an object gets garbage-collected, the garbage collector gives the object an opportunity to clean up after itself through a call to the object's finalize method. This process is known as finalization. Most programmers don't have to worry about implementing the finalize method. In rare cases, however, a programmer might have to implement a finalize method to release resources, such as native peers, that aren't under the control of the garbage collector.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 32
Propriet di classe
Classi g.Point2, g.Rectangle2, testG.TestG2
G. Bruno
Slide 33
package g; public class Point2 { private static int nPoints = 0; public static int getNPoints() {return nPoints;} public static Point2 origin = new Point2(0,0); int x = 0; // attributi
class Point2
int y = 0;
public Point2 (int a, int b) { // costruttore x = a; y = b; nPoints++; } public void move (int a, int b) {x = a; y = b;} public String toString(){return "x = " + x + " y = " + y;}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 34
class Rectangle2
package g;
class TestG2
package testG; import g.*; public class TestG2 {
G. Bruno
Slide 36
Stringhe
classi String e StringBuffer
G. Bruno
Slide 37
return dest.toString();
} public static void main(String[] args) { System.out.println(reverseIt("alfabeto")); // otebafla
}
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 38
Class String
Strings are constant; their values cannot be changed after they are created.
String c = "abc".substring(2,3); public char charAt(int index) public boolean equalsIgnoreCase(String anotherString)
G. Bruno
Slide 39
public final class String extends Object implements Serializable The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class. Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example:
public String(String value) Allocates a new string that contains the same sequence of characters as the string argument. public String(char value[]) Allocates a new String so that it represents the sequence of characters currently contained in the character array argument. public String(StringBuffer buffer)
Allocates a new string that contains the sequence of characters currently contained in the string buffer argument.
public int length() Returns the length of this string. The length is equal to the number of 16-bit Unicode characters in the string.
G. Bruno
Slide 41
public boolean equalsIgnoreCase(String anotherString) Compares this String to another object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object, where case is ignored. public int compareTo(String anotherString) Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. Returns: the value 0 if the argument string is equal to this string; a value less than 0 if this string is lexicographically less than the string argument; and a value greater than 0 if this string is lexicographically greater than the string argument. public boolean startsWith(String prefix, int toffset) Tests if this string starts with the specified prefix.
Returns the index within this string of the first occurrence of the specified substring.
G. Bruno
Slide 42
public String substring(int beginIndex) Returns a new string that is a substring of this string. The substring begins at the specified index and extends to the end of this string. public String substring(int beginIndex, int endIndex) Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Throws: StringIndexOutOfBoundsException if the beginIndex or the endIndex is out of range.
G. Bruno
Slide 43
Class StringBuffer
A string buffer implements a mutable sequence of characters. String buffers are safe for use by multiple threads. The methods are synchronized where necessary so that all the operations on any particular instance behave as if they occur in some serial order. String buffers are used by the compiler to implement the binary string concatenation operator +. For example, the code: x = "a" + 4 + "c" is compiled to the equivalent of: x = new StringBuffer().append("a").append(4).append("c") .toString() The principal operations on a StringBuffer are the append and insert methods, which are overloaded so as to accept data of any type. public StringBuffer(int length) Constructs a string buffer with no characters in it and an initial capacity specified by the length argument. Throws: NegativeArraySizeException
G. Bruno
Slide 44
String palindrome = "Dot saw I was Tod"; int len = palindrome.length(); String anotherPalindrome = "Niagara. O roar again!"; char aChar = anotherPalindrome.charAt(9); //car. O String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(11, 15); //da 11 a 15: roar
StringBuffer sb = new StringBuffer("Drink Java!"); sb.insert(6, "Hot "); System.out.println(sb.toString()); This code snippet prints: Drink Hot Java!
Another useful StringBuffer modifier is setCharAt, which replaces the character at a specific location in the StringBuffer with the character specified in the argument list. You can use valueOf to convert variables of different types to Strings. For example, to print the value of pi: System.out.println(String.valueOf(Math.PI));
G. Bruno
Slide 45
Converting Strings to Numbers The String class itself does not provide any methods for converting a String to a floating point, integer, or other numerical type. However, four of the "type wrapper" classes (Integer, Double, Float, and Long) provide a class method named valueOf that converts a String to an object of that type.
G. Bruno
Slide 46
Wrapper Classes
Boolean, Character, Double, Float, Integer, Long ClassType(type) - constructor - Character c1 = new Character(x); type typeValue() - char c2 = c1.charValue(); String toString()
G. Bruno
Slide 47
class Wrapper
package pkg1; public class Wrapper { public static void main(String[] args) {
G. Bruno
Slide 48
Class Integer
java.lang.Object | +----java.lang.Number | +----java.lang.Integer public final class Integer extends Number The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int. In addition, this class provides several methods for converting an int to a String and a String to an int, as well as other constants and methods useful when dealing with an int.
G. Bruno
Slide 49
public static final int MIN_VALUE The smallest value of type int. public static final int MAX_VALUE The largest value of type int. public Integer(int value) Constructs a newly allocated Integer object that represents the primitive int argument. public Integer(String s)
Constructs a newly allocated Integer object that represents the value represented by the string. The string is converted to an int value as if by the valueOf method.
throws NumberFormatException
G. Bruno
Slide 50
public static String toBinaryString(int i) Creates a string representation of the integer argument as an unsigned integer in base 2. public static int parseInt(String s) Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' to indicate a negative value. throws NumberFormatException public static Integer valueOf(String s) Returns a new Integer object initialized to the value of the specified String. Throws an exception if the String cannot be parsed as an int. The radix is assumed to be 10. throws NumberFormatException public int intValue() Returns the value of this Integer as an int. public long longValue() Returns the value of this Integer as a long. public String toString() Returns a String object representing this Integer's value. public boolean equals(Object obj) Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 51
Byte
Double Float Integer
Long
Short BigDecimal BigInteger
Conversioni
int Integer int String.valueOf
intValue
Integer
Integer.parseInt
String
toString
Integer, Integer.valueOf
String
G. Bruno
Slide 53
Arrays
G. Bruno
Slide 54
Here's a simple program, called ArrayDemo, that creates the array, puts some values in it, and displays the values.
public class ArrayDemo { public static void main(String[] args) { int[] anArray; // declare an array of integers
}
Slide 55
To get the size of an array, you write arrayname.length Be careful: Programmers new to the Java programming language are tempted to follow length with an empty set of parenthesis. This doesn't work because length is not a method. length is a property provided by the Java platform for all arrays. The Java programming language provides a shortcut syntax for creating and initializing an array. Here's an example of this syntax:
boolean[] answers = {true, false, true, true, false};
G. Bruno
Slide 56
Here's a small program, ArrayOfStringsDemo that creates an array containing three string objects then prints the strings in all lower case letters.
public class ArrayOfStringsDemo { public static void main(String[] args) { String[] anArray = { "String One", "String Two", "String Three" }; //
initializer
G. Bruno
Slide 57
Here's a simple program, called ArrayDemo, that creates the array, puts some values in it, and displays the values.
public class ArrayDemo { public static void main(String[] args) { int[] anArray; // declare an array of integers anArray = new int[10]; // create an array of int // assign a value to each array element and print for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); Aggiungete un } metodo che calcoli la System.out.println(); } }
G. Bruno
Slide 58
As with arrays of objects, you must explicitly create the sub-arrays within an array. So if you don't use an initializer, you need to write code like the following, public class ArrayOfArraysDemo2 { public static void main(String[] args) { int[][] aMatrix = new int[4][]; //populate matrix for (int i = 0; i < aMatrix.length; i++) { aMatrix[i] = new int[5]; //create sub-array for (int j = 0; j < aMatrix[i].length; j++) { aMatrix[i][j] = i + j; } } } } You must specify the length of the primary array when you create the array. You can leave the length of the sub-arrays unspecified until you create them.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 59
package pkg1;
ArrayOfArraysDemo2
}}
System.out.println(aMatrix); //[[I@3e25a5 System.out.println(java.util.Arrays.toString(aMatrix)); //[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1]
System.out.println(java.util.Arrays.deepToString(aMatrix));
//[[0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]] }}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 60
public class ArrayOfArraysDemo2 { public static void main(String[] args) { int[][] aMatrix = new int[2][]; for (int i = 0; i < aMatrix.length; i++) { aMatrix[i] = new int[3]; //create sub-array for (int j = 0; j < aMatrix[i].length; j++) { aMatrix[i][j] = i + j; }}
Matrici
public static void printMatrix(int[][] aMatrix1) { for (int i = 0; i < aMatrix1.length; i++) {
0 0:1
0 1:2 1 0:3 1 1:4
0 0:0
0 1:0 0 2:0 1 0:0 1 1:0 1 2:0
printMatrix(aMatrix);
System.out.println(); int[][] aMatrix1 = { {1,2}, {3,4} }; printMatrix(aMatrix1); System.out.println(); int[][] aMatrix2 = new int[2][3]; printMatrix(aMatrix2);}
G. Bruno
Slide 61
package pkg1; public class Ellissi { public static int sum(int... val){ int[]array = val; System.out.println(java.util.Arrays.toString(array)); int r = 0; for (int i:val) r+=i; return r; } public static void main(String[] args) { System.out.println(sum(10,20,30)); //60 System.out.println(sum()); //0 } }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Ellissi
Slide 62
Ereditariet
Una classe pu ereditare le propriet di un'altra classe, pu ridefinirle e aggiungerne altre. Polimorfismo
Dynamic binding
Down-cast
G. Bruno
Slide 63
Ereditariet
public int getX()
Point
public int getY() public Point(int x, int y) public void move(int x, int y)
IsA
Particle
Particle
package g; public class Particle extends Point {
private int m;
public int getM() {return m;} public void setM(int m) {this.m = m;} public Particle(int x, int y, int m) {super(x,y); this.m = m;} public String toString(){return super.toString() + " m = " + m;} } Note
La prima istruzione del costruttore di Particle deve essere la chiamata di un costruttore della classe di base.
Le propriet della classe di base non private sono accessibili mediante il rif. super.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 65
Uso
Classi g.Particle, testG.TestParticle
G. Bruno
Slide 66
package testG;
import g.*;
public class TestParticle { public static void main(String[] args) { Point p; Particle pa; Point p1 = new Point(23, 94); Particle pa1 = new Particle(10,20,100); pa1.move(1,2); // metodo ereditato
class TestParticle
class TestParticle
//p definito di tipo Point, ma pu puntare anche ad oggetti di classe derivata da Point //dynamic binding: la versione di toString() da chiamare dipende dal //tipo dell'oggetto effettivamente puntato //p.setM(10); // errore, p definito di tipo Point, quindi non vede setM //pa = p; // inaccettabile; se pa puntasse ad un point la chiamata di pa.setM //lecita sintatticamente, produrrebbe un errore a run-time pa = (Particle)p; // down-cast, se il programmatore insiste
//x = 10 y = 20 x = 1 y = 2 m = 100 x = 0 y = 1
}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 68
Polimorfismo
Definizioni
Un riferimento di tipo T (come p di tipo Point) pu puntare ad un oggetto il cui tipo T o un qualunque sottotipo di T (cio un tipo che estende T).
Dynamic binding Quando sul rif. t di tipo T si chiama un metodo m, il codice eseguito dall'interprete dipende dal tipo dell'oggetto puntato, che pu essere T o un suo sottotipo. L'interprete esegue la prima implementazione di m trovata nella scansione dal tipo dell'oggetto puntato a T. Up-cast p = pa; // p di tipo Point, pa di tipo Particle
Il tipo del rif. a destra un sottotipo del tipo del rif. a sinistra; rientra nel polimorfismo di p.
Down-cast pa = (Particle) p;
Il tipo del rif. a destra un supertipo del tipo del rif. a sinistra. Si suppone che p punti ad oggetto compatible con pa, cio che il suo tipo sia Particle o un sottotipo di Particle. L'operazione pu produrre un'eccezione se la supposizione errata.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 69
Es. di protected
package inheritance; import g.*; public class Particle_i extends Point_i { private int m; public int getM() {return m;} public void setM(int m) {this.m = m;} public Particle_i(int x, int y, int m) {super(x,y); this.m = m;} public String toString(){return "x = " + x + " y = " + y + " m = " + m;} }
package testG; import g.*; public class TestParticle1 { static void move(Point p, int d) {p.move(d,d); System.out.println(p); } public static void main(String[] args) { Point p = new Point(10,20); Particle pa = new Particle(15,25,100); System.out.println(pa); move(p,1000); move(pa,2000); System.out.println(pa instanceof Particle); //true System.out.println(pa instanceof Point); //true System.out.println(p instanceof Particle); // false p = pa; System.out.println(p instanceof Particle); //true Point[] v = {new Point(10,20),new Particle(15,25,100)}; System.out.println(java.util.Arrays.toString(v)); //[x = 10 y = 20, x = 15 y = 25 m = 100] } }
G. Bruno
Slide 71
Omonimie
One interesting feature of Java member variables is that a class can access a hidden member variable through its superclass. Consider the following superclass and subclass pair: class A { Integer aNumber; } class B extends A { Float aNumber; } The aNumber variable in B hides aNumber in A. But you can access A's aNumber from B with
super.aNumber
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 72
Inheritance
A subclass inherits all of the members in its superclass that are accessible to that subclass unless the subclass explicitly hides a member variable or overrides a method. Note that constructors are not members and are not inherited by subclasses. The following list itemizes the members that are inherited by a subclass:
Inheritance
A subclass cannot override methods that are declared final in the superclass (by definition, final methods cannot be overridden).
Also, a subclass cannot override methods that are declared static in the superclass. In other words, a subclass cannot override a class method. A subclass can hide a static method in the superclass by declaring a static method in the subclass with the same signature as the static method in the superclass.
G. Bruno
Slide 74
public class ClassA { public void methodOne(int i) { } public void methodTwo(int i) { } public static void methodThree(int i) { } public static void methodFour(int i) { }} public class ClassB extends ClassA { public static void methodOne(int i) { } public void methodTwo(int i) { } public void methodThree(int i) { } public static void methodFour(int i){ }}
Hiding, overriding
a. Which method overrides a method in the superclass? b. Which method hides a method in the superclass? c. What do the other methods do?
G. Bruno
Slide 75
Question 1a: Which method overrides a method in the superclass? Answer 1a: methodTwo Question 1b: Which method hides a method in the superclass? 1b Answer 1b: methodFour SuppressWarnings("static-access") Question 1c: What do the other methods do? public static void main(String[] args) { Answer 1c: They cause compile-time errors. public class ClassB extends ClassA { public static void methodOne(int i) { //This static method cannot hide the instance method from ClassA } public void methodTwo(int i) { } public void methodThree(int i) { //This instance method cannot override the static method } public static void methodFour(int i) { }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 ClassA a = new ClassA(); ClassB b = new ClassB(); b.methodFour(10); }
Hiding, overriding
Slide 76
G. Bruno
Slide 77
Classi astratte
abstract Figura
public abstract void disegna()
Gerarchia di classi
public static void test() { Figura[] v = {new Cerchio(), new Rettangolo()}; for (Figura f: v){ (f.disegna();}}
G. Bruno
Slide 79
Interfacce
Oggetti di classi differenti possono interpretare ruoli simili attraverso un'interfaccia comune.
Un'interfaccia simile ad una classe astratta e contiene dichiarazioni (intestazioni) di metodi. package g; public interface Movable { void move(int x, int y);
}
public class Point implements Movable { public class Rectangle implements Movable {
G. Bruno
Slide 80
import g.*; public class DemoG { public static void main(String[] args) { Point p; Particle pa; Movable m; Point p1 = new Point(23, 94); Particle pa1 = new Particle(10,20,100); Rectangle r1 = new Rectangle (1000,2000); m = p1; m.move(1,2); m = r1; m.move(1,2); m = pa1; m.move(1,2);
Uso
G. Bruno
Slide 81
Expression Tree
public static void main(String[] args) { Computable root = new Mult (new Add(new Operand(10), new Operand(20)), new Operand(3)); System.out.println(root.compute()); } Risultato: 90 Progetto Expression Tree
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 82
public abstract class Operator implements Computable { Computable left, right; public abstract int compute();} public class Add extends Operator{
package treeClasses;
public int compute() {return left.compute() + right.compute();} public Add(Computable left, Computable right){this.left = left; this.right = right;}} public class Mult extends Operator{ public int compute() {return left.compute() * right.compute();} public Mult(Computable left, Computable right){this.left = left; this.right = right;}} public class Operand implements Computable{int value; public int compute() {return value;} public Operand(int value){this.value = value;}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 83
Exceptions
G. Bruno
Slide 84
Exceptions
The term exception is shorthand for the phrase "exceptional event." It can be defined as follows: Definition: An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.
The runtime system searches backwards through the call stack, beginning with the method in which the error occurred, until it finds a method that contains an appropriate exception handler.
G. Bruno
Slide 85
Eccezioni
G. Bruno
Slide 86
G. Bruno
Slide 87
Runtime Exceptions
Runtime exceptions represent problems that are detected by the runtime system. This includes arithmetic exceptions (such as when dividing by zero), pointer exceptions (such as trying to access an object through a null reference), and indexing exceptions (such as attempting to access an array element through an index that is too large or too small).
G. Bruno
Slide 88
Eccezioni
at ProvaEccezioni.m1(ProvaEccezioni.java:7)
at ProvaEccezioni.main(ProvaEccezioni.java:4) Exception in thread "main"
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 89
Eccezioni
public class ProvaEccezioni1 { public static void main(String[] args) { System.out.println(m1("abc"));} static int m1(String s1){ int i; try { i = Integer.parseInt(s1); } catch(NumberFormatException e){i = -1;} return i;
}
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 90
Eccezioni
public class ProvaEccezioni { public static void main(String[] args) { try{ System.out.println(m1("abc")); } catch(NumberFormatException e){System.out.println("E");}}
Eccezioni
La classe dell'eccezione deve essere Throwable oppure una classe derivata. Un blocco catch pu contenere un blocco try/catch. catch (Exception e) { try{ System.out.println("Caught exception " + e.getMessage()); int total = 0; int correct = 10; int n = correct/total;} catch (Exception f){ System.out.println("Caught exception B " + f.getMessage());} }}
G. Bruno
Slide 92
Eccezioni
public static void main(String[] args) { try{ try{ int total = 0; int correct = 10; int n = correct/total; } catch (Exception e) { System.out.println("Caught exception " + e.getMessage());
G. Bruno
Slide 93
Eccezioni
Luso delle eccezioni evita di attribuire significati di errore ai risultati dei metodi e costringe il chiamante ad intervenire.
static boolean passingGrade(int correct, int total) throws Exception { boolean Result = false; if (correct > total) throw new Exception ("Invalid values"); if ((float)correct / (float)total > 0.7) Result = true; return Result; }
G. Bruno
Slide 94
System.out.println(passingGrade(60,80));
System.out.println(passingGrade(80,60));
System.out.println(passingGrade(40,80)); //never gets executed } catch (Exception e) { System.out.println("Caught exception " + e.getMessage());
}}
Output:
G. Bruno
Slide 95
Question: Is the following code legal? try { ... } finally { ... } Question: What exceptions can be caught by the following handler? ... } catch (Exception e) { ... } catch (ArithmeticException a) { ... }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 96
Question: Match each situation in the first column with an item in the second column. (1: error, 2: checked exception, 3: runtime exception, 4: no exception) 1. int[] A; A[0] = 0; 2. The Java VM starts running your program, but the VM cant find the Java platform classes. (The Java platform classes reside in classes.zip or rt.jar.)
Errori di cast
Esempio TestParticle p = p1;
pa = (Particle)p;
pa.setM(10); Exception in thread "main" java.lang.ClassCastException: g.Point cannot be cast to g.Particle at testG.TestParticle.main(TestParticle.java:28)
G. Bruno
Slide 98
package arrays; public class ArrayMgr1 { static int lp(int[] v1, int[] v2) throws Exception { if (v1.length != v2.length) throw new Exception ("invalid data"); int r = 0; for (int i = 0; i < v1.length; i++) {r += v1[i] * v2[i];} return r; } public static void main(String[] args) { int[] v1 = {1,3}; int[] v2 = {1,3,4}; try { System.out.println(lp(v1,v1)); System.out.println(lp(v1,v2)); } catch (Exception e) { System.out.println("exception: " + e.getMessage()); }}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Slide 99
Class Object
The Object class sits at the top of the class hierarchy tree in the Java platform. Every class in the Java system is a descendent, direct or indirect, of the Object class. This class defines the basic state and behavior that all objects must have, such as the ability to compare oneself to another object, to convert to a string, to wait on a condition variable, to notify other objects that a condition variable has changed, and to return the class of the object. Your classes may want to override the following Object methods. clone
equals, hashCode
finalize - chiamato prima della garbage collection toString Your class cannot override these Object methods (they are final): getClass, notify, notifyAll, wait
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 100
Class Object
Returns the object of type Class that represents the runtime class of the object. public native int hashCode() Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable. public boolean equals(Object obj) Compares two Objects for equality.
public String toString() Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommendedthat all subclasses override this method. protected void finalize() throws Throwable Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup.
G. Bruno
Slide 102
Method Summary protected Object clone() Creates and returns a copy of this object. boolean equals(Object obj) Indicates whether some other object is "equal to" this one. protected void finalize() Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. Class<?> getClass() Class Object from Returns the runtime class of this Object. http://download.oracle.com/javase/6 int hashCode() /docs/api/java/lang/Object.html Returns a hash code value for the object. void notify() Wakes up a single thread that is waiting on this object's monitor. void notifyAll() Wakes up all threads that are waiting on this object's monitor. String toString() Returns a string representation of the object. void wait() Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. void wait(long timeout) Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed. void wait(long timeout, int nanos) Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.
G. Bruno
Slide 103
package g; public class Point { private int x,y; public int getX() {return x;} public int getY() {return y;}
equals
G. Bruno
Slide 104
package testG; import g.*; public class TestEquals { public static void main(String[] args) {
class TestEquals
}
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 105
Esempi di clonazione
Classi g.Point1, g.Rectangle1, testG.TestG1
G. Bruno
Slide 106
package g;
class Point1
package g;
package testG;
import g.*;
public class TestG1 { public static void main(String[] args) { Point1 p1 = new Point1(23, 94); Point1 p2 = (Point1) p1.clone(); p2.move(10,20); System.out.println(p1); // x = 23 y = 94 System.out.println(p2); // x = 10 y = 20
class TestG1
G. Bruno
Slide 109
getClass
The getClass method is a final method that returns a runtime representation of the class of an object. This method returns a Class object. Once you have a Class object you can query it for various information about the class, such as its name, its superclass, and the names of the interfaces that it implements. The following method gets and displays the class name of an object: void PrintClassName(Object obj) { System.out.println("The Object's class is " + obj.getClass().getName()); } One handy use of a Class object is to create a new instance of a class without knowing what the class is at compile time. The following sample method creates a new instance of the same class as obj, which can be any class that inherits from Object (which means that it could be any class): Object createNewInstanceOf(Object obj) { return obj.getClass().newInstance();}
public Object newInstance() throws InstantiationException, IllegalAccessException
G. Bruno
Slide 110
import g.*;
Uso di Class
G. Bruno
Slide 111
hashCode e toString
public class Info {
int val; public Info(int val) {this.val = val;} }
System.out.println(a.hashCode());
System.out.println(b.hashCode()); System.out.println(a); System.out.println(b);
Info@82ba41
}}
G. Bruno
Slide 112
hashCode e toString
int val;
public Info(int val) {this.val = val;} public int hashCode() {return val;} public String toString() {return String.valueOf(val);}
}
public class InfoTest { public static void main(String[] args) { Info a = new Info(10);
System.out.println(b);
}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Slide 113
JDK
java.lang: wrappers for basic data types and strings; threads; mathematical operations; exceptions; the System class; and the Object base class. java.io: Classes for controlling file and stream operations. java.util: a class for manipulating dates; basic data structure classes, such as hash tables and stacks; a tool for parsing Strings. java.applet: This package contains the Applet class. java.awt: The AWT (Abstract Window Toolkit) package provides simple and advanced tools used to direct the visual interface of a Java applet.
G. Bruno
Slide 114
Class System
System.runFinalization(); This method calls the finalize methods on all objects that are waiting to be garbage collected. System.gc(); Running the Garbage Collector. byte[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' }; byte[] copyTo = new byte[7]; System.arraycopy(copyFrom, 2, copyTo, 0, 7); long clickTime = System.currentTimeMillis(); System.exit(-1); // status code <> 0 terminazione anormale
G. Bruno
Slide 115
The following program, ArrayCopyDemo, uses arraycopy to copy some elements from the copyFrom array to the copyTo array. public class ArrayCopyDemo { public static void main(String[] args) { char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' }; char[] copyTo = new char[7]; System.arraycopy(copyFrom, 2, copyTo, 0, 7); System.out.println(new String(copyTo)); } } The arraycopy method call in this example program begins the copy at element number 2 in the source array.
Output: caffein
G. Bruno
Slide 116
Classe Math
Math Class (final con metodi statici) come ad esempio static double sin(double a)
G. Bruno
Slide 117
package generici;
Tipi generici
package generici; public class TestBox { public static void main(String[] args) { Box<Integer> b1 = new Box<Integer>(); Box<String> b2 = new Box<String>(); System.out.println(b1.put(10)); //true System.out.println(b1.get()); //10 System.out.println(b2.put("alfa")); //true System.out.println(b2.put("beta")); //false System.out.println(b2.get()); //alfa }}
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 118
G. Bruno
Tipi generici
package generici; public interface Queue <E> { boolean put (E v);
E get ();
int size(); }
G. Bruno
Slide 119
package generici; @SuppressWarnings("unchecked") public class SimpleQueue <E> implements Queue <E>{ private int size; protected E[] b; protected int iw, ir; private int occupiedSlots = 0; public SimpleQueue (int size) { b = (E[])new Object[size]; //b = new E[size]; //Cannot create a generic array of E this.size = size;} private void write (E v) {b[iw] = v; iw = (iw + 1) % size; occupiedSlots++;} private E read () {E v = b[ir]; ir = (ir + 1) % size; occupiedSlots--; return v;} public boolean put (E v) { boolean res = occupiedSlots < size; if (res) write(v); return res;} public E get () {E res = null; if (occupiedSlots > 0) res = read();return res;} buffer circolare public int size() {return occupiedSlots;}}
SimpleQueue
G. Bruno
Slide 120
TestQueue
package generici; public class TestQueue { public static void main(String[] args) { SimpleQueue<Integer> q1 = new SimpleQueue<Integer>(3); q1.put(1); q1.put(2); System.out.println(q1.get()); //1 SimpleQueue<String> q2 = new SimpleQueue<String>(3); q2.put("alfa"); q2.put("beta");
System.out.println(q2.get()); //alfa
System.out.println(q2.size()); //1 } }
G. Bruno
Slide 121
Interface Enumeration<E>
boolean hasMoreElements() Tests if this enumeration contains more elements.
E nextElement()
Returns the next element of this enumeration if this enumeration object has at least one more element to provide.
G. Bruno
Slide 122
Nested Classes
Java lets you define a class as a member of another class. Such a class is called a nested class and is illustrated here: class EnclosingClass{ ... class ANestedClass { ... } } Definition: A nested class is a class that is a member of another class.
G. Bruno
Slide 123
package generici;
import java.util.*;
@SuppressWarnings("unchecked") public class SimpleQueue1<E> extends SimpleQueue<E>{ public SimpleQueue1(int size) {super(size);}
SimpleQueue1
public Enumeration<E> enumerator() {return new QueueEnum<E>();} private class QueueEnum<T> implements Enumeration<T> { int i = ir; public boolean hasMoreElements() {return (i != iw);} public T nextElement() { if (!hasMoreElements()) throw new NoSuchElementException(); else return (T)b[i++]; //vedi nota }
}
}
G. Bruno
package generici; import java.util.*; public class TestQueue1 { public static double getSum(SimpleQueue1<? extends Number> q) { double sum = 0.0; for (Enumeration<? extends Number> e = q.enumerator(); e.hasMoreElements();) { sum += e.nextElement().doubleValue();} return sum;} public static void main(String[] args) { SimpleQueue1<Integer> q1 = new SimpleQueue1<Integer>(3); q1.put(1); q1.put(2); for (Enumeration<Integer> e = q1.enumerator(); e.hasMoreElements();) { 1 2 System.out.println(e.nextElement()); 3.0 } System.out.println(getSum(q1));
TestQueue1
//System.out.println(getSum(q2)); //errore The method getSum(SimpleQueue1<? extends Number>) in the type TestQueue1
//is not applicable for the arguments (SimpleQueue1<String>)
}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 125
package testG; import g.*; import java.lang.reflect.*; public class DemoG2 { public static void main(String[] args) { Rectangle r1 = new Rectangle(100,200); //Class c1 = r1.getClass();
Class<T>
// Class is a raw type. References to generic type Class<T> should be parameterized Class<Rectangle> c0 = Rectangle.class; System.out.println(c0.getName()); // g.Rectangle Class<? extends Rectangle> c1 = r1.getClass(); System.out.println(c1.getName()); // g.Rectangle
System.out.println(m);}}}
G. Bruno
Collections
G. Bruno
Slide 127
Collections
A collection is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve and manipulate data, and to transmit data from one method to another. Collections typically represent data items that form a natural group, like a poker hand (a collection of cards), a mail folder (a collection of letters), or a telephone directory (a collection of name-to-phone-number mappings). A collections framework is a unified architecture for representing and manipulating collections. All collections frameworks contain three things:
Interfaces: abstract data types representing collections. Interfaces allow collections to be manipulated independently of the details of their representation. In object-oriented languages like Java, these interfaces generally form a hierarchy.
Implementations: concrete implementations of the collection interfaces. In essence, these are reusable data structures.
Algorithms: methods that perform useful computations, like searching and sorting, on objects that implement collection interfaces. These algorithms are said to be polymorphic because the same method can be used on many different implementations of the appropriate collections interface. In essence, algorithms are reusable functionality.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 128
Collezioni
Interface Implementation Set List HashSet ArrayList TreeSet LinkedList Vector Stack Hashtable Properties Historical
Map
HashMap
TreeMap
Collection
Iterator, ListIterator
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 129
G. Bruno
The two general purpose Set implementations are HashSet and TreeSet. It's very straightforward to decide which of these two to use. HashSet is much faster (constant time vs. log time for most operations), but offers no ordering guarantees. If you need to use the operations in the SortedSet, or in-order iteration is important to you, use TreeSet. Otherwise, use HashSet. The two general purpose List implementations are ArrayList and LinkedList. Most of the time, you'll probably use ArrayList. It offers constant time positional access, and it's just plain fast, because it does not have to allocate a node object for each element in the List, and it can take advantage of the native method System.arraycopy when it has to move multiple elements at once. Think of ArrayList as Vector without the synchronization overhead. ArrayList has one tuning parameter, the initial capacity. The two general purpose Map implementations are HashMap and TreeMap. The situation for Map is exactly analogous to Set. If you need SortedMap operations or inorder Collection-view iteration, go for TreeMap; otherwise, go for HashMap. Everything else in the Set section also applies to Map so just re-read it.
G. Bruno
Slide 130
boolean containsAll(Collection<?> c)
G. Bruno
Slide 131
Set, Collection
boolean removeAll(Collection<?> c) Removes all of this collection's elements that are also contained in the specified collection. boolean retainAll(Collection<?> c) Retains only the elements in this collection that are contained in the specified collection. int size() Returns the number of elements in this collection. Object[] toArray() Returns an array containing all of the elements in this collection.
<T> T[]
toArray(T[] a)
Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array.
G. Bruno
Slide 132
boolean addAll(Collection<? extends E> c) HashSet<Point> s1 = new HashSet<Point>(); HashSet<Particle> s2 = new HashSet<Particle>(); s1.addAll(s2); boolean removeAll(Collection<?> c) c pu essere una collezione di qualsiasi tipo
Note
G. Bruno
Slide 133
Sets
A Set is a Collection that cannot contain duplicate elements. Set models the mathematical set abstraction. The Set interface extends Collection and contains no methods other than those inherited from Collection. The JDK contains two general-purpose Set implementations. HashSet, which stores its elements in a hash table, is the best-performing implementation. TreeSet, which stores its elements in a red-black tree, guarantees the order of iteration.
G. Bruno
Slide 134
Bulk operations
The bulk operations are particularly well suited to Sets: they perform standard setalgebraic operations. Suppose s1 and s2 are Sets. Here's what the bulk operations do: s1.containsAll(s2): Returns true if s2 is a subset of s1. (For example, set s1 is a subset of s2 if set s2 contains all the elements in s1.) s1.addAll(s2): Transforms s1 into the union of s1 and s2. (The union of two sets is the set containing all the elements contained in either set.) s1.retainAll(s2): Transforms s1 into the intersection of s1 and s2. (The intersection of two sets is the set containing only the elements that are common in both sets.)
s1.removeAll(s2): Transforms s1 into the (asymmetric) set difference of s1 and s2. (For example, the set difference of s1 - s2 is the set containing all the elements found in s1 but not in s2.) s1.clear(): Removes all elements.
The addAll, removeAll, and retainAll methods all return true if the target Collection was modified in the process of executing the operation.
G. Bruno
Slide 135
Interface Iterator<E>
boolean hasNext() Returns true if the iteration has more elements. E next()
G. Bruno
Slide 136
Esempio
package collezioni; import java.util.*; public class Collezioni1 { public static void main(String[] args) { Set<String> hs; hs = new HashSet<String>(); Set<String> ripetuti = new TreeSet<String>(); String[] v = {"alfa", "beta", "alfa", "delta, "beta"}; for (String s:v) if (!hs.add(s)) ripetuti.add(s);
G. Bruno
Slide 137
Esempio
hs.toArray(v2);
System.out.println(Arrays.toString(v2)); // [alfa, delta, beta] Set<String> hs1; hs1 = new HashSet<String>(); hs1.addAll(Arrays.asList(v2)); System.out.println(hs1); // [alfa, delta, beta] // iterazioni su set for (String s: hs) System.out.println(s);
Costruttori di HashSet
HashSet() Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75). HashSet(Collection<? extends E> c) Constructs a new set containing the elements in the specified collection. HashSet(int initialCapacity)
Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75).
HashSet(int initialCapacity, float loadFactor) Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and the specified load factor.
G. Bruno
Slide 139
Costruttori di TreeSet
TreeSet() Constructs a new, empty tree set, sorted according to the natural ordering of its elements. TreeSet(Collection<? extends E> c) Constructs a new tree set containing the elements in the specified collection, sorted according to the natural ordering of its elements. TreeSet(Comparator<? super E> comparator)
Constructs a new, empty tree set, sorted according to the specified comparator.
TreeSet(SortedSet<E> s) Constructs a new tree set containing the same elements and using the same ordering as the specified sorted set.
G. Bruno
Slide 140
Note
TreeSet(Collection<? extends E> c) Il tipo di c pu essere E o un sottotipo di E.
G. Bruno
Slide 141
Natural ordering
This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method. Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort). Objects that implement this interface can be used as keys in a sorted map or as elements in a sorted set, without the need to specify a comparator.
The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C. Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.
int compareTo(T o) Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 142
Ordinamento
Un HashSet aggiunge un nuovo elemento se il suo hashCode diverso da quelli gi presenti oppure se equals falso per tutti gli oggetti di pari hashCode. Per avere gli elementi ordinati occorre usare un TreeSet e implementare l'interfaccia Comparable (e quindi il metodo compareTo).
G. Bruno
Slide 143
public boolean equals (Object o) { if (!(o instanceof Point)) return false; Point p = (Point)o; return this.x == p.x && this.y == p.y;} public int hashCode () {return this.x + 31 * this.y;} public int compareTo (Point p) { // increasing x incr y if (this.x == p.x) { if (this.y == p.y) return 0; else if (this.y < p.y) return -1; else return 1; } else { if (this.x < p.x) return -1; else return 1;} } }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 144
class PointComparator
package collezioni; import java.util.Comparator; public class PointComparator implements Comparator<Point>{
G. Bruno
Slide 145
package collezioni; import java.util.*; public class Collezioni2 { public static void main(String[] args) { Set<Point> ps = new HashSet<Point>(); ps.add(new Point(10,20)); ps.add(new Point(15,25)); ps.add(new Point(5,25)); ps.add(new Point(10,20)); ps.add(new Point(15,30)); System.out.println(ps); // [x = 15 y = 25, x = 10 y = 20, x = 5 y = 25, x = 15 y = 30] Set<Point> ps1 = new TreeSet<Point>(ps); System.out.println(ps1); // [x = 5 y = 25, x = 10 y = 20, x = 15 y = 25, x = 15 y = 30] PointComparator comp = new PointComparator(); Set<Point> ps2 = new TreeSet<Point>(comp); for (Point p: ps) ps2.add(p); System.out.println(ps2); // [x = 15 y = 30, x = 15 y = 25, x = 10 y = 20, x = 5 y = 25]}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Test
Slide 146
Class TreeSet<E>
Class TreeSet<E> implements Collection<E>, NavigableSet<E>, Set<E>, SortedSet<E>
G. Bruno
Slide 147
SortedSet<E>
E first() Returns the first (lowest) element currently in this set. SortedSet<E> headSet(E toElement) Returns a view of the portion of this set whose elements are strictly less than toElement. E last() Returns the last (highest) element currently in this set. SortedSet<E> subSet(E fromElement, E toElement)
Returns a view of the portion of this set whose elements range from fromElement, inclusive, to toElement, exclusive.
SortedSet<E> tailSet(E fromElement) Returns a view of the portion of this set whose elements are greater than or equal to fromElement.
G. Bruno
Slide 148
List
A List is an ordered Collection(sometimes called a sequence). Lists may contain duplicate elements. In addition to the operations inherited from Collection, the List interface includes operations for: Positional Access: manipulate elements based on their numerical position in the list.
Search: search for a specified object in the list and return its numerical position.
List Iteration: extend Iterator semantics to take advantage of the list's sequential nature. Range-view: perform arbitrary range operations on the list.
The JDK contains two general-purpose List implementations. ArrayList, which is generally the best-performing implementation, and LinkedList which offers better performance under certain circumstances.
G. Bruno
Slide 149
boolean add(E e)
Interface List<E>
boolean equals(Object o)
E get(int index) int hashCode() int indexOf(Object o) Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element. boolean isEmpty() Returns the element at the specified position.
G. Bruno
Slide 150
Iterator<E> iterator()
int lastIndexOf(Object o)
List
Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain the element. ListIterator<E> listIterator() Returns a list iterator over the elements in this list.
boolean retainAll(Collection<?> c)
E set(int index, E element) Replaces the element at the specified position with element. int size() List<E> subList(int fromIndex, int toIndex)
Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive.
Object[] toArray()
G. Bruno
package collezioni; import java.util.*; public class ListExample { public static void main(String args[]) { List<String> list = new ArrayList<String>(); list.add("Bernadine"); list.add("Elizabeth"); list.add("Gene"); list.add("Elizabeth"); list.add("Clara");
Liste
System.out.println(list); // [Bernadine, Elizabeth, Gene, Elizabeth, Clara] System.out.println("2: " + list.get(2)); // 2: Gene System.out.println("0: " + list.get(0)); // 0: Bernadine LinkedList<String> queue = new LinkedList<String>(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); // [Clara, Elizabeth, Gene, Elizabeth, Bernadine] queue.removeLast(); queue.removeLast();
Liste
for (ListIterator<String> i=queue.listIterator(queue.size()); i.hasPrevious();) System.out.println(i.previous()); // Gene Elizabeth Clara // replacing names starting with E for (ListIterator<String> i=queue.listIterator(); i.hasNext();) if(i.next().startsWith("E")) i.remove(); System.out.println(queue); //[Clara, Gene] // swapping the two elements
G. Bruno
Slide 153
Costruttori
Constructs a list containing the elements of the specified collection, in the order they are returned by the collection's iterator.
ArrayList(int initialCapacity) Constructs an empty list with the specified initial capacity. LinkedList() Constructs an empty list.
G. Bruno
Slide 154
void add(E e)
Interface ListIterator<E>
boolean hasNext()
Returns true if this list iterator has more elements when traversing the list in the forward direction.
boolean hasPrevious() Returns true if this list iterator has more elements when traversing the list in the reverse direction. E next() int nextIndex() E previous() Returns the next element in the list. Returns the index of the element that would be returned by a subsequent call to next. Returns the previous element in the list.
int previousIndex()
void remove()
Returns the index of the element that would be returned by a subsequent call to previous.
Removes from the list the last element that was returned by next or previous.
void set(E e)
G. Bruno
Replaces the last element returned by next or previous with the specified element.
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 155
package collezioni;
import java.util.*;
public class Collezioni3 { public static void main(String[] args) { List<String> l1 = new ArrayList<String>();
Sorting
anonymous class
System.out.println(Collections.max(l1)); // delta
System.out.println(Collections.frequency(l1, "alfa")); // 1 Collections.shuffle(l1, new Random());
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 156
Sorting
Collections.sort(l2, comp1);
System.out.println(l2); // [x = 15 y = 30, x = 15 y = 25, x = 10 y = 20, x = 5 y = 25] System.out.println(Collections.binarySearch(l2, new Point(10,20), comp1)); // 2 }}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 157
Algorithms
The polymorphic algorithms described in this section are pieces of reusable functionality provided by the JDK. All of them come from the Collections class. All take the form of static methods whose first argument is the collection on which the operation is to be performed. The great majority of the algorithms provided by the Java platform operate on List objects, but a couple of them (min and max) operate on arbitrary Collection objects. Searching
The binarySearch algorithm searches for a specified element in a sorted List using the binary search algorithm.
The following idiom, usable with both forms of the binarySearch operation, looks for the specified search key, and inserts it at the appropriate position if it's not already present: int pos = Collections.binarySearch(l, key); if (pos < 0) l.add(-pos-1, key);
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 158
static <T> boolean addAll(Collection<? super T> c, T... elements) Adds all of the specified elements to the specified collection. static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
Searches the specified list for the specified object using the binary search algorithm.
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
Searches the specified list for the specified object using the binary search algorithm.
static <T> void copy(List<? super T> dest, List<? extends T> src) Copies all of the elements from one list into another. static <T> void fill(List<? super T> list, T obj) static int frequency(Collection<?> c, Object o)
Returns the number of elements in the specified collection equal to the specified object.
Class Collections
Replaces all of the elements of the specified list with the specified element.
static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
Returns the maximum element, according to the order induced by the specified comparator. G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 159
Class Collections
Map
A Map is an object that maps keys to values. A map cannot contain duplicate keys: Each key can map to at most one value. The JDK contains two new general-purpose Map implementations. HashMap, which stores its entries in a hash table, is the best-performing implementation. TreeMap, which stores its entries in a red-black tree, guarantees the order of iteration.
G. Bruno
Slide 161
static interface Map.Entry<K,V> A map entry (key-value pair). void clear() Removes all of the mappings from this map. boolean containsKey(Object key)
Interface Map<K,V>
Returns true if this map contains a mapping for the specified key.
boolean containsValue(Object value) Returns true if this map maps one or more keys to the specified value. Set<Map.Entry<K,V>> entrySet()
int hashCode()
boolean isEmpty() Set<K> keySet() V put(K key, V value)
G. Bruno
Interface Map<K,V>
void putAll(Map<? extends K,? extends V> m) Copies all of the mappings from the specified map to this map. V remove(Object key) Removes the mapping for a key from this map if it is present. int size() Returns the number of key-value mappings in this map. Collection<V> values()
G. Bruno
Slide 163
Interface Map.Entry<K,V>
boolean equals(Object o) Compares the specified object with this entry for equality. K getKey()
G. Bruno
Slide 164
Map
The Collection-view methods allow a Map to be viewed as a Collection in three ways: keySet: the Set of keys contained in the Map. values: The Collection of values contained in the Map. This Collection is not a Set, as multiple keys can map to the same value. entrySet: The Set of key-value pairs contained in the Map. The Map interface provides a small nested interface called Map.Entry that is the type of the elements in this Set.
G. Bruno
Slide 165
HashMap() Constructs an empty HashMap with the default initial capacity (16) and the
default load factor (0.75).
Constructs a new, empty tree map, ordered according to the given comparator.
TreeMap(Map<? extends K,? extends V> m) Constructs a new tree map containing the same mappings as the given map, ordered according to the natural ordering of its keys.
TreeMap(SortedMap<K,? extends V> m) Constructs a new tree map containing the same mappings and using the same ordering as the specified sorted map.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 166
For starters, suppose you want to know whether one Map is a submap of another, that is, whether the first Map contains all of the key-value mappings in the second. The following idiom does the trick: if (m1.entrySet().containsAll(m2.entrySet())) { } Along similar lines, suppose that you want to know if two Map objects contain mappings for all the same keys: if (m1.keySet().equals(m2.keySet())) { } Suppose you want to remove all the key-value pairs that one Map has in common with another: m1.entrySet().removeAll(m2.entrySet()); Suppose you want to remove from one Map all the keys that have mappings in another: m1.keySet().removeAll(m2.keySet());
G. Bruno
Slide 167
Mappe
String testo = "The poem was inspired by the sight of a field full of golden daffodils waving in the wind";
String[] parole = testo.split(" "); System.out.println(Arrays.toString(parole)); Map<String, Parola> m = new TreeMap <String, Parola>(); for (String s: parole) {Parola p = m.get(s); if (p == null) m.put(s, new Parola(s)); else p.incr();} System.out.println(m); //{The=The:1, a=a:1, by=by:1, daffodils=daffodils:1, field=field:1, full=full:1, golden=golden:1, // stampa per occorrenze decr List<Parola> list = new ArrayList<Parola>(m.values());
Collections.sort(list);
System.out.println(list); //[of:2, the:2, The:1, a:1, by:1, daffodils:1, field:1, full:1, golden:1, in:1, inspired:1, poem:1, sight:1, was:1, waving:1, wind:1]
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 168
Mappe
G. Bruno
Slide 169
class Parola
package collezioni;
Utilities
Date, Calendar
Date() Allocates a Date object and initializes it so that it represents the time at which it was allocated, measured to the nearest millisecond.
Random
StringTokenizer
Uso di Random
Random randGen = new Random();
Calendar
import java.util.Calendar; import java.util.GregorianCalendar; public class GestioneDate {
if (c1.after(c2)
System.out.println(c1.getTime()); //Wed Apr 21 17:58:08 CEST 2004
G. Bruno
Slide 172
Class Random
An instance of this class is used to generate a stream of pseudorandom numbers. The class uses a 48-bit seed, which is modified using a linear congruential formula.
public Random() Creates a new random number generator. Its seed is initialized to a value based on the current time. public Random(long seed) Creates a new random number generator using a single long seed. public float nextFloat() Returns the next pseudorandom, uniformly distributed float value between 0.0 and 1.0 from this random number generator's sequence. public int nextInt()
Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 173
StringTokenizer
String CurrentLine = "a: b: c: while (st.hasMoreTokens()) System.out.println(st.nextToken() + "|"); a| b| d "; StringTokenizer st = new StringTokenizer(CurrentLine,":", false);
c|
d |
G. Bruno
Slide 174
public class StringTokenizer extends Object implements Enumeration public StringTokenizer(String str, String delim, boolean returnTokens)
Constructs a string tokenizer for the specified string. The characters in the delim argument are the delimiters for separating tokens. If the returnTokens flag is true, then the delimiter characters are also returned as tokens. Each delimiter is returned as a string of length one. If the flag is false, the delimiter characters are skipped and only serve as separators between tokens.
public boolean hasMoreTokens() Tests if there are more tokens available from this tokenizer's string. public String nextToken() Returns the next token from this string tokenizer. Throws: NoSuchElementException if there are no more tokens in this tokenizer's string. public boolean hasMoreElements() Returns the same value as the hasMoreTokens method. It exists so that this class can implement the Enumeration interface. public Object nextElement() Returns the same value as the nextToken method, except that its declared return value is Object rather than String. It exists so that this class can implement the Enumeration interface. Throws: NoSuchElementException if there are no more tokens in this tokenizer's string. public int countTokens() Calculates the number of times that this tokenizer's nextToken method can be called before it generates an exception.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 175
public final class Scanner extends Object implements Iterator<String> A simple text scanner which can parse primitive types and strings using regular expressions. A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods. For example, this code allows a user to read a number from System.in: Scanner sc = new Scanner(System.in); int i = sc.nextInt(); As another example, this code allows long types to be assigned from entries in a file myNumbers: Scanner sc = new Scanner(new File("myNumbers")); while (sc.hasNextLong()) {long aLong = sc.nextLong();} The scanner can also use delimiters other than whitespace. This example reads several items in from a string: String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); prints the following output: 1 2 red blue
Scanner
Slide 176
G. Bruno
Programmazione ad oggetti
Giorgio Bruno
Dip. Automatica e Informatica Politecnico di Torino Tel. 011 5647003, email: giorgio.bruno@polito.it Parte 2 aggiornata
G. Bruno
Slide 1
Enum
enum Season { WINTER, SPRING, SUMMER, FALL }
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES } Suppose you want to add data and behavior to an enum. For example consider the planets of the solar system. Each planet knows its mass and radius, and can calculate its surface gravity and the weight of an object on the planet. Here is how it looks:
G. Bruno
Slide 2
package pkg1;
enum Planet
VENUS (4.869e+24, 6.0518e6), (6.421e+23, 3.3972e6), SATURN (5.688e+26, 6.0268e7), NEPTUNE (1.024e+26, 2.4746e7),
Planet(double mass, double radius) {this.mass = mass; this.radius = radius;} public double mass() { return mass; } public double radius() { return radius; } // universal gravitational constant (m3 kg-1 s-2) public static final double G = 6.67300E-11;
class TestPlanetEnum
package pkg1; public class TestPlanetEnum { public static void main(String[] args) { double earthWeight = Double.parseDouble(args[0]); double mass = earthWeight/Planet.EARTH.surfaceGravity(); for (Planet p : Planet.values()) System.out.printf("Your weight on %s is %.2f%n",
p, p.surfaceWeight(mass));
} }
Your weight on MERCURY is 26,44 Your weight on VENUS is 63,35 Your weight on EARTH is 70,00 Your weight on MARS is 26,51 Your weight on JUPITER is 177,14 Your weight on SATURN is 74,62 Your weight on URANUS is 63,36 Your weight on NEPTUNE is 79,68 Your weight on PLUTO is 4,68
G. Bruno
Slide 4
Patterns
An architectural pattern expresses a fundamental structural organization or schema for software systems. It provides a set of predefined subsystems, specifies their responsibilities, and includes rules and guidelines for organizing the relationships between them. Design Patterns A design pattern provides a scheme for refining the subsystems or components of a software system, or the relationships between them. It describes commonly recurring structure of communicating components that solves a general design problem within a particular context. Idioms An idiom is a low-level pattern specific to a programming language. An idiom describes how to implement particular aspects of components or the relationships between them using the features of the given language.
G. Bruno
Slide 5
Pattern publish/subscribe
Ci sono agenzie e abbonati; le agenzie pubblicano notizie generali o notizie sportive e le inviano agli abbonati. Gli abbonati possono essere persone o aziende e si abbonano alle agenzie.
<<interface>> Agenzia
<<interface>> Abbonato
G. Bruno
Slide 6
Ci sono agenzie e abbonati; le agenzie pubblicano notizie generali o notizie sportive e le inviano agli abbonati. Gli abbonati possono essere persone o aziende e si abbonano alle agenzie. void addAbbonato (Abbonato a);
Modello UML
<<interface>> Agenzia
Azienda NotiziaSportiva
G. Bruno
Slide 7
G. Bruno
Slide 8
package abbonamenti;
public interface Abbonato { public void riceviNotizia(Notizia nt); } package abbonamenti;
Interfacce
G. Bruno
Slide 9
package abbonamenti;
public class Notizia { String contenuto; protected String dettagli = ""; public Notizia(String contenuto) {this.contenuto = contenuto;} public String toString() {return contenuto + " " + dettagli;}
Notizie
}
package abbonamenti;
}
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 10
G. Bruno
class AgenziaStd
package abbonamenti; import java.util.*;
G. Bruno
Slide 11
package abbonamenti;
Abbonati
super(name, agenzie);
}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 12
main
Singleton pattern
Garantisce che di una classe esista ununica istanza.
G. Bruno
Slide 14
package audioclip;
Singleton pattern
import audioclip.*;
Uso
stop
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 16
The concept of standard input and output streams is a C library concept that has been assimilated into the Java environment. There are three standard streams, all of which are managed by the java.lang.System class: Standard input--referenced by System.in Used for program input, typically reads input entered by the user. Standard output--referenced by System.out Used for program output, typically displays information to the user.
I/O
G. Bruno
Slide 17
Classi di IO
I/O su file di blocchi di byte I/O di tipi primitivi readInt, readDouble, readUTF writeInt, writeDouble, writeUTF
IOException
DataInputStream
DataOutputStream
InputStreamReader IOException
OutputStreamWriter
readLine
BufferedReader PrintWriter
caratteri - testo
FileReader
FileNotFoundException
G. Bruno
FileWriter
IOException
file di caratteri
FileNotFoundException extends IOException
Slide 18
Le classi FileOutputStream e FileInputStream sono usate per l'apertura dei file; possono produrre eccezioni. Le classi DataOutputStream e DataInputStream sono usate per scrivere/leggere valori di tipi predefiniti.
G. Bruno
Slide 19
Esempi
Progetto EsempiFile
Scrittura e lettura di rettangoli
Es.
r0 60 2 1000 2000 r1 61 68 1000 2000
r2 4 99 1000 2000
G. Bruno
Slide 20
class Rettangolo
G. Bruno
package test;
TestClass
ArrayList<Rettangolo> genList() {
ArrayList<Rettangolo> list = new ArrayList<Rettangolo>(); for (int i = 0; i < 3; i++) list.add(new Rettangolo("r" + i, v(100), v(100), 1000, 2000)); return list;} public static void main(String[] args) { TestClass tc = new TestClass(); ArrayList<Rettangolo> list = tc.genList(); tc.txtFile("rettangoli.txt", list); tc.binFile("rettangoli.bin", list); tc.readText();}
G. Bruno
Slide 22
void txtFile (String fileName, ArrayList<Rettangolo> list) { try{ PrintWriter out = new PrintWriter(new FileWriter(fileName)); for(Rettangolo r: list) out.println(r); out.close();
TestClass
Class FileWriter
public class FileWriter extends OutputStreamWriter Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
G. Bruno
Slide 24
Class PrintWriter
public class PrintWriter extends Writer Print formatted representations of objects to a text-output stream. This class implements all of the print methods found in PrintStream. It does not contain methods for writing raw bytes, for which a program should use unencoded byte streams. Unlike the PrintStream class, if automatic flushing is enabled it will be done only when one of the println() methods is invoked, rather than whenever a newline character happens to be output. The println() methods use the platform's own notion of line separator rather than the newline character. Methods in this class never throw I/O exceptions. The client may inquire as to whether any errors have occurred by invoking checkError().
G. Bruno
Slide 25
Class FileReader
public class FileReader extends InputStreamReader Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream. public FileReader(String fileName) throws FileNotFoundException
G. Bruno
Slide 27
Class BufferedReader
public class BufferedReader extends Reader Read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines. The buffer size may be specified, or the default size may be used. The default is large enough for most purposes. public BufferedReader(Reader in) Create a buffering character-input stream that uses a default-sized input buffer. public String readLine() throws IOException Read a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed. Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached public void close() throws IOException Close the stream.
G. Bruno
Slide 28
TestClass
DataOutputStream out = new DataOutputStream(new FileOutputStream(fileName)); for(Rettangolo r: list) r.toBinFile(out); out.close(); DataInputStream in = new DataInputStream(new FileInputStream(fileName)); try {
while (true) {
String n = in.readUTF(); int x = in.readInt(); int y = in.readInt(); int h = in.readInt(); int w = in.readInt(); Rettangolo r1 = new Rettangolo(n, x, y, h, w); System.out.println(r1); } } catch (EOFException e) {} in.close(); }catch(IOException e){e.printStackTrace();}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 29
Class FileOutputStream
public class FileOutputStream extends OutputStream A file output stream is an output stream for writing data to a File or to a FileDescriptor. public FileOutputStream(String name) throws IOException
Creates an output file stream to write to the file with the specified name.
public void write(byte b[], int off, int len) throws IOException Writes len bytes from the specified byte array starting at offset off to this file output stream. public native void close() throws IOException Closes this file output stream and releases any system resources associated with this stream.
G. Bruno
Slide 30
Class DataOutputStream
public class DataOutputStream extends FilterOutputStream implements DataOutput A data input stream lets an application write primitive Java data types to an output stream in a portable way. An application can then use a data input stream to read the data back in. public DataOutputStream(OutputStream out) Creates a new data output stream to write data to the specified underlying output stream. public final void writeInt(int v) throws IOException
Writes an int to the underlying output stream as four bytes, high byte first.
public final void writeFloat(float v) throws IOException Converts the float argument to an int using the floatToIntBits method in class Float, and then writes that int value to the underlying output stream as a 4-byte quantity, high byte first. public final void writeUTF(String str) throws IOException Writes a string to the underlying output stream using UTF-8 encoding in a machineindependent manner.
G. Bruno
Slide 31
Class FileInputStream
public class FileInputStream extends InputStream A file input stream is an input stream for reading data from a File or from a FileDescriptor. public FileInputStream(String name) throws FileNotFoundException Creates an input file stream to read from a file with the specified name. public int read(byte b[], int off, int len) throws IOException Reads up to len bytes of data from this input stream into an array of bytes. This method blocks until some input is available. public native void close() throws IOException
Closes this file input stream and releases any system resources associated with the stream.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 32
Class DataInputStream
public class DataInputStream extends FilterInputStream
implements DataInput
A data input stream lets an application read primitive Java data types from an underlying input stream in a machine-independent way. An application uses a data output stream to write data that can later be read by a data input stream. public DataInputStream(InputStream in) Creates a new data input stream to read data from the specified input stream.
G. Bruno
Slide 33
Reads a Unicode character from this data input stream. This method reads two bytes from the underlying input stream. If the bytes read, in order, are b1 and b2, where 0 <= b1, b1 <= 255, then the result is equal to: (char)((b1 << 8) | b2)
This method blocks until either the two bytes are read, the end of the stream is detected, or an exception is thrown. Throws: EOFException if this input stream reaches the end before reading two bytes. Throws: IOException if an I/O error occurs. public final int readInt() throws IOException Reads a signed 32-bit integer from this data input stream. This method reads four bytes from the underlying input stream. public final float readFloat() throws IOException Reads a float from this data input stream. public final String readLine() throws IOException Note: readLine() is deprecated. This method does not properly convert bytes to characters. As of JDK 1.1, the preferred way to read lines of text is via the BufferedReader.readLine() method. public static final String readUTF(DataInput in) throws IOException Reads in a string from the specified data input stream. The string has been encoded using a modified UTF-8 format.
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 34
G. Bruno
TestClass
BufferedReader keyboard =
new BufferedReader(new InputStreamReader(System.in)); //read user's input
while (true) {
System.out.print("input text: "); String line1 = keyboard.readLine(); System.out.println(line1.toUpperCase()); if (line1.equalsIgnoreCase("end")) break; } }catch(IOException e){ e.printStackTrace();}}
G. Bruno
Slide 35
Class InputStreamReader
An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and translates them into characters according to a specified character encoding. The encoding that it uses may be specified by name, or the platform's default encoding may be accepted. public InputStreamReader(InputStream in) Create an InputStreamReader that uses the default character encoding. public int read() throws IOException Read a single character. Returns: The character read, or -1 if the end of the stream has been reached. Throws: IOException If an I/O error occurs. public int read(char cbuf[], int off, int len) throws IOException Read characters into a portion of an array. public boolean ready() throws IOException
Tell whether this stream is ready to be read. An InputStreamReader is ready if its input buffer is not empty, or if bytes are available to be read from the underlying byte stream.
public void close() throws IOException Close the stream.
G. Bruno
Slide 36
Threads
G. Bruno
Slide 37
Threads
A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently. Every thread has a priority. Threads with higher priority are executed in preference to threads with lower priority. Each thread may or may not also be marked as a daemon. When code running in some thread creates a new Thread object, the new thread has its priority initially set equal to the priority of the creating thread, and is a daemon thread if and only if the creating thread is a daemon. When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which typically calls the method named main of some designated class). The Java Virtual Machine continues to execute threads until either of the following occurs: The exit method of class Runtime has been called and the security manager has permitted the exit operation to take place. All threads that are not daemon threads have died, either by returning from the call to the run method or by performing the stop method. There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. The other way to create a thread is to declare a class that implements the Runnable interface.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 38
Stati
A thread becomes Not Runnable when one of these events occurs: Its sleep method is invoked. The thread calls the wait method to wait for a specific condition to be satisifed. The thread is blocking on I/O.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 40
package threads; public class SimpleThread extends Thread { public SimpleThread(String name) { super(name); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) {} } System.out.println("DONE! " + getName()); } public static void main (String[] args) { new SimpleThread("Torino").start(); new SimpleThread("Milano").start(); }}
G. Bruno
SimpleThread
0 Milano 1 Torino 2 Torino 1 Milano 3 Torino 4 Torino 2 Milano 5 Torino 3 Milano 6 Torino 7 Torino 4 Milano 8 Torino 5 Milano 6 Milano 9 Torino 7 Milano 8 Milano DONE! Torino 9 Milano DONE! Milano
Slide 41
Thread infinito
package threads;
public class SimpleThread1 extends Thread { public SimpleThread1(String name) {super(name); } public void run() { int i = 0; try { while (true){ System.out.println(i++ + " " + getName()); sleep((long)(Math.random() * 1000)); } } catch (InterruptedException e) {} System.out.println("DONE! " + getName());}}
G. Bruno
Slide 42
package threads;
import java.io.*;
public class TimerThread extends Thread{ private int durata; private Thread[] threads;
TestSimpleThread1
input durata in s: 2 0 Torino 0 Milano 1 Milano 1 Torino 2 Milano 2 Torino 3 Milano 3 Torino 4 Torino 4 Milano DONE! Milano DONE! Torino
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); System.out.print("input durata in s: "); int durata = Integer.parseInt(keyboard.readLine());
G. Bruno
Slide 44
Sincronizzazioni
Esempio di produttori e consumatori che interagiscono tramite un buffer circolare. I produttori scrivono (aggiungono) dati; i consumatori leggono (tolgono) dati. Versione 1. Se il buffer pieno, il produttore non scrive. Se il buffer vuoto, il consumatore non legge. Versione 2. Se il buffer pieno, il produttore aspetta. Se il buffer vuoto, il consumatore aspetta.
G. Bruno
Slide 45
package threads; public class SimpleBuffer { int size; private String[] b; int iw, ir; protected int occupiedSlots = 0; public SimpleBuffer (int size) {b = new String[size]; this.size = size;} protected void write (String v) {b[iw] = v; iw = (iw + 1) % size; occupiedSlots++;} protected String read () { String v = b[ir]; ir = (ir + 1) % size; occupiedSlots--; return v; } public synchronized boolean put (Thread t, String v) throws InterruptedException { boolean res = occupiedSlots < size; if (res) write(v); return res; } public synchronized String get (Thread t) throws InterruptedException { String res = null; if (occupiedSlots > 0) res = read(); return res; }}
class SimpleBuffer
G. Bruno
Slide 46
package threads; import java.util.*; public class Producer extends Thread{ int interval; SimpleBuffer b; List<String> log = new ArrayList<String>(); public Producer(String name, int interval, SimpleBuffer b) { super(name); this.interval = interval; this.b = b;} public void run() { String[] text = "The early part of her life was spent in Paris".split(" "); int i = 0; try { while (true){ if (b.put(this, text[i])) log.add(text[i]); i = (i+1) % text.length; long p = (long)(Math.random() * 1000 * interval); sleep(p); } } catch (InterruptedException e) {} System.out.println(getName() + " put " + log);} }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Producer
Slide 47
package threads; import java.util.*; public class Consumer extends Thread{ int interval; SimpleBuffer b; List<String> log = new ArrayList<String>(); public Consumer(String name, int interval, SimpleBuffer b) { super(name); this.interval = interval; this.b = b;} public void run() { try { while (true){ String s = b.get(this); if (s != null) log.add(s); long p = (long)(Math.random() * 1000 * interval); sleep(p); } } catch (InterruptedException e) {} System.out.println(getName() + " put " + log);} }
Consumer
G. Bruno
Slide 48
package threads; import java.io.*; import java.util.Scanner; public class TestProdCons { public static void main(String[] args) throws IOException, Exception {
TestProdCons
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); System.out.print("input duration in s, size, producer rate, consumer rate, buffer (S,Q): ");
String line = keyboard.readLine(); Scanner s = new Scanner(line); int duration = s.nextInt(); int size = s.nextInt(); int pRate = s.nextInt(); int cRate = s.nextInt(); String bufferType = s.next(); SimpleBuffer b; if (bufferType.equalsIgnoreCase("S")) b = new SimpleBuffer(size); else b = new QBuffer(size); Producer p1 = new Producer("p1", pRate, b); Consumer c1 = new Consumer("c1", cRate, b); Consumer c2 = new Consumer("c2", cRate, b); TimerThread tt = new TimerThread(duration, p1, c1, c2); tt.start(); }}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 49
Trace
input duration in s, size, producer rate, consumer rate, buffer (S,Q): 10 3 1 4 s c1 put [early, her, spent] p1 put [The, early, part, of, her, life, spent, early, of, her, spent] c2 put [The, part, of, life, early]
G. Bruno
Slide 50
package threads; public class QBuffer extends SimpleBuffer { public QBuffer (int size) {super(size);} public synchronized boolean put (Thread t, String v) throws InterruptedException { while (occupiedSlots == size) { System.out.println(t.getName() + " waiting before putting " + v); wait(); } System.out.println(t.getName() + " put " + v); write(v); notifyAll(); return true; } public synchronized String get (Thread t) throws InterruptedException { while (occupiedSlots == 0) { System.out.println(t.getName() + " waiting before getting "); wait(); } String res = read(); System.out.println(t.getName() +" got " + res); notifyAll(); return res; }}
QBuffer
G. Bruno
Slide 51
Synchronized
Mentre un thread esegue un metodo synchronized di un oggetto, gli altri thread che chiamano un metodo synchronized sullo stesso oggetto sono bloccati. Ogni oggetto ha un lock, chiamato monitor. Quando un thread chiama un metodo synchronized di un oggetto il cui lock libero, il thread acquisisce il lock (che diventa impegnato) ed esegue il metodo. Se invece il lock impegnato si accoda. Quando un metodo synchronized termina, il lock diventa libero e pu essere acquisito da un eventuale thread in coda. Una wait rilascia il lock e sospende il thread corrente, che verr poi risvegliato da una notify o notifyAll eseguita da un altro thread. Il thread risvegliato deve accertarsi che le condizioni di prosecuzione siano verificate: in caso contrario chiama ancora la wait (di solito si usa un loop).
G. Bruno
Slide 52
input duration in s, size, producer rate, consumer rate, buffer (S,Q): 10 3 1 4 q c1 waiting before getting p1 put The c1 got The c2 waiting before getting p1 put early c2 got early p1 put part p1 put of c1 got part p1 put her c2 got of c2 got her p1 put life p1 put was p1 put spent c1 got life p1 put in p1 waiting before putting Paris
c2 got was p1 put Paris c2 got spent p1 put The p1 waiting before putting early c1 got in p1 put early p1 waiting before putting part c1 got Paris p1 put part c1 got The c2 got early p1 put of c2 got part p1 put her p1 put life p1 waiting before putting was c1 put [The, part, life, in, Paris, The] c2 put [early, of, her, was, spent, early, part] p1 put [The, early, part, of, her, life, was, spent, in, Paris, The, early, part, of, her, life]
Trace
G. Bruno
Slide 53
awt e swing
Event-driven programming
G. Bruno
Slide 54
SwingApplication creates four commonly used Swing components: a frame, or main window (JFrame) a panel, sometimes called a pane (JPanel) a button (JButton) a label (JLabel)
The frame is a top-level container. It exists mainly to provide a place for other Swing components to paint themselves. The other commonly used top-level containers are dialogs (JDialog) and applets (JApplet). The panel is an intermediate container. Its only purpose is to simplify the positioning of the button and label. Other intermediate Swing containers, such as scroll panes (JScrollPane) and tabbed panes (JTabbedPane), typically play a more visible, interactive role in a program's GUI. The button and label are atomic components -- components that exist not to hold random Swing components, but as self-sufficient entities that present bits of information to the user. Often, atomic components also get input from the user. The Swing API provides many atomic components, including combo boxes (JComboBox), text fields (JTextField), and tables (JTable).
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 55
Esempio
EsempiGUI ButtonDemo
G. Bruno
Slide 56
package pkg1;
ButtonDemo
public static final int WIDTH = 300; public static final int HEIGHT = 100; int val = 0; JLabel labelV; public static void main(String[] args) { ButtonDemo gui = new ButtonDemo();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gui.setVisible(true);}
public ButtonDemo() {setSize(WIDTH, HEIGHT); setTitle("Demo"); Container contentPane = getContentPane(); contentPane.setBackground(Color.GRAY);
contentPane.setLayout(new FlowLayout());
JButton buttonP = new JButton("+"); buttonP.addActionListener(this); contentPane.add(buttonP); JButton buttonM = new JButton("-"); buttonM.addActionListener(this); contentPane.add(buttonM); labelV = new JLabel("0"); contentPane.add(labelV);}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 57
ButtonDemo
public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("+")) labelV.setText(String.valueOf(++val)); else if (e.getActionCommand().equals("-")) labelV.setText(String.valueOf(--val)); } }
G. Bruno
Slide 58
Interface ActionListener
java.awt.event Interface ActionListener
void actionPerformed(ActionEvent e)
java.awt.event Class ActionEvent String getActionCommand()
Returns the command string associated with this action. int getModifiers() Returns the modifier keys held down during this action event. long getWhen() Returns the timestamp of when this event occurred.
String paramString()
Returns a parameter string identifying this action event.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 59
package pkg1; import javax.swing.*;import java.awt.*;import java.awt.event.*; @SuppressWarnings("serial") public class ButtonDemo1 extends JFrame { public static final int WIDTH = 300; public static final int HEIGHT = 100; int val = 0; JLabel labelV; public static void main(String[] args) { ButtonDemo1 gui = new ButtonDemo1(); gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gui.setVisible(true);} public ButtonDemo1(){setSize(WIDTH, HEIGHT); setTitle("Demo"); Container contentPane = getContentPane(); contentPane.setBackground(Color.GRAY); contentPane.setLayout(new FlowLayout()); Listener l = new Listener(); JButton buttonP = new JButton("+");buttonP.addActionListener(l); contentPane.add(buttonP); JButton buttonM = new JButton("-");buttonM.addActionListener(l); contentPane.add(buttonM); labelV = new JLabel("0"); contentPane.add(labelV);}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
ButtonDemo1
Slide 60
ButtonDemo1
private class Listener implements ActionListener { public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("+")) labelV.setText(String.valueOf(++val));
else if (e.getActionCommand().equals("-"))
labelV.setText(String.valueOf(--val)); }
}
}
G. Bruno
Slide 61
ButtonDemo1a
ButtonDemo2
public ButtonDemo2() { setSize(WIDTH, HEIGHT); setTitle("Demo"); Container contentPane = getContentPane(); contentPane.setBackground(Color.GRAY); contentPane.setLayout(new FlowLayout()); JButton buttonP = new JButton("+"); buttonP.addActionListener(this); contentPane.add(buttonP); JButton buttonM = new JButton("-"); buttonM.addActionListener(this); contentPane.add(buttonM);
String initialValue = JOptionPane.showInputDialog("Enter initial value"); val = Integer.parseInt(initialValue); labelV = new JLabel(initialValue);
contentPane.add(labelV);
G. Bruno
Slide 63
Layout principali
G. Bruno
Slide 64
Layout principali
Layout management is the process of determining the size and position of components. By default, each container has a layout manager -- an object that performs layout management for the components within the container. The Java platform supplies five commonly used layout managers: BorderLayout, BoxLayout, FlowLayout, GridBagLayout, and GridLayout.
G. Bruno
Slide 65
Event handling
Every time the user types a character or pushes a mouse button, an event occurs. Any object can be notified of the event. All it has to do is implement the appropriate interface and be registered as an event listener on the appropriate event source. Swing components can generate many kinds of events.
Act that results in the event
User clicks a button, presses Return while typing in a text field, or chooses a menu item User closes a frame (main window) User presses a mouse button while the cursor is over a component User moves the mouse over a component Component becomes visible Component gets the keyboard focus Table or list selection changes
Listener type
ActionListener
G. Bruno
Slide 66
Each event is represented by an object that gives information about the event and identifies the event source. Event sources are typically components, but other kinds of objects can also be event sources. As the following figure shows, each event source can have multiple listeners registered on it. Conversely, a single listener can register with multiple event sources.
Caption: Multiple listeners can register to be notified of events of a particular type from a particular source.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 67
Caption: When the user clicks a button, the button's action listeners are notified. Event-handling code executes in a single thread, the eventdispatching thread. This ensures that each event handler will finish executing before the next one executes. For instance, the actionPerformed method in the preceding example executes in the event-dispatching thread. Painting code also executes in the event-dispatching thread. This means that while the actionPerformed method is executing, the program's GUI is frozen -- it won't repaint or respond to mouse clicks, for example.
G. Bruno
Slide 68
Painting
When a Swing GUI needs to paint itself -- whether for the first time, in response to becoming unhidden, or because it needs to reflect a change in the program's state -- it starts with the highest component that needs to be repainted and works its way down the containment hierarchy. This process is orchestrated by the AWT painting system, and made more efficient and smooth by the Swing repaint manager and doublebuffering code. In this way, each component paints itself before any of the components it contains. This ensures that the background of a JPanel, for example, is visible only where it isn't covered by painting performed by one of the components it contains.
1. background (if opaque) 2. custom painting (if any) 3. border (if any) 4. children (if any)
G. Bruno
Slide 69
Previsioni
Si progetti uninterfaccia grafica che consenta linserimento di una serie di temperature per varie citt; le temperature sono valori interi. Il comando Clear cancella gli elementi gi inseriti; il comando All visualizza lelenco ordinato per citt. (1) Esempio di inserimento di una coppia citt temperatura (se linserimento accettato appare added nellarea di testo). (2) Esempio di risultato del comando All.
EsempiGUI Previsioni
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 70
package pkg1;
import javax.swing.*;
import java.awt.*; import java.awt.event.*; import java.util.*;
Previsioni
@SuppressWarnings("serial")
public class Previsioni extends JFrame implements ActionListener {public static final int LINES = 10; public static final int CHAR_PER_LINE = 40; private JTextArea theText; private JTextField townTF; private JTextField tTF; private Map<String, Integer> tMap = new TreeMap<String, Integer>(); public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true); Previsioni gui = new Previsioni(); gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gui.pack(); gui.setVisible(true);}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 71
Previsioni
private void addButton(String label, JPanel panel, ActionListener listener){ JButton button = new JButton(label); button.addActionListener(listener);
panel.add(button);}
private JTextField addTF(String label, int length, JPanel panel){ JTextField tf = new JTextField(label,length);
G. Bruno
Slide 72
public Previsioni() { JPanel buttonPanel = new JPanel(); buttonPanel.setBackground(Color.white); addButton("Add",buttonPanel,this); addButton("Clear",buttonPanel,this); addButton("All",buttonPanel,this);
Previsioni
contentPane.add(buttonPanel, BorderLayout.SOUTH);
JPanel textPanel = new JPanel(); textPanel.setBackground(Color.blue); theText = new JTextArea(LINES, CHAR_PER_LINE); theText.setBackground(Color.white); textPanel.add(theText); contentPane.add(textPanel, BorderLayout.CENTER); JPanel textFPanel = new JPanel(); textFPanel.setBackground(Color.white); townTF = addTF("", 20, textFPanel); tTF = addTF("", 10, textFPanel); contentPane.add(textFPanel, BorderLayout.NORTH); }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 73
Previsioni
}}
else if (actionCommand.equals("Clear")) tMap.clear();
else if (actionCommand.equals("All")){
theText.setText(tMap.toString());}} }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 74
ListDemo
G. Bruno
Slide 75
package pkg1;
import javax.swing.*;
import java.awt.*; @SuppressWarnings("serial") // esempio Sun rivisto public class ListDemo extends JFrame { //JButton removeButton; public static void main(String[] args) { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); ListDemo frame = new ListDemo(); frame.setTitle("ListDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ListDemo
ListDemo
listModel.addElement("Cagliari");listModel.addElement("Firenze");
// Create the list and put it in a scroll pane. list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); list.setVisibleRowCount(5); JScrollPane listScrollPane = new JScrollPane(list); JButton addButton = new JButton("add"); JButton removeButton = new JButton("remove"); text = new JTextField(10);
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 77
ListDemoListener listener =
ListDemo
ListDemoListener
public class ListDemoListener implements ActionListener { JButton removeButton; JList list; DefaultListModel listModel; JTextField text; public ListDemoListener(JButton button, JList l, DefaultListModel lM, JTextField t) { removeButton = button; list = l; listModel = lM; text = t; }
G. Bruno
Slide 79
ListDemoListener
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("remove")) { int index = list.getSelectedIndex(); listModel.remove(index); int size = listModel.getSize(); if (size == 0) removeButton.setEnabled(false); else { //Select an index. if (index == listModel.getSize()) index--; list.setSelectedIndex(index); list.ensureIndexIsVisible(index); }
G. Bruno
Slide 80
ListDemoListener
text.requestFocusInWindow(); text.setText("");
// Select the new item and make it visible. list.setSelectedIndex(index); list.ensureIndexIsVisible(index);
ListDemo1
public interface ListSelectionListener extends EventListener void valueChanged(ListSelectionEvent e) Called whenever the value of the selection changes. public ListSelectionEvent(Object source, int firstIndex, int lastIndex, boolean isAdjusting) Represents a change in selection status between firstIndex and lastIndex, inclusive. firstIndex is less than or equal to lastIndex. The selection of at least one index within the range will have changed.
G. Bruno
Slide 82
ListDemo1
Nel costruttore
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e){ text.setText((String)listModel.getElementAt(list.getSelectedIndex()));
}
});
G. Bruno
Slide 83
Applets
G. Bruno
Slide 84
Every applet is implemented by creating a subclass of the Applet class. The following figure shows the inheritance hierarchy of the Applet class. This hierarchy determines much of what an applet can do and how, as you'll see on the next few pages.
Panel is the simplest container class. A panel provides space in which an application can attach any other component, including other panels. The default layout manager for a panel is the FlowLayout layout manager. A component is an object having a graphical representation that can be displayed on the screen and that can interact with the user. Examples of components are the buttons, checkboxes, and scrollbars of a typical graphical user interface. The Component class is the abstract superclass of the nonmenu-related Abstract Window Toolkit components.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 85
Applets
G. Bruno
Slide 86
import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class SimpleApplet extends Applet{ String text = "I'm a simple applet"; public void init() { setBackground(Color.CYAN); } public void start() {} public void stop() {} public void destroy() {} public void paint(Graphics g){ //System.out.println("Paint"); g.setColor(Color.blue); g.drawRect(0, 0, getSize().width -1, getSize().height -1); g.setColor(Color.red); g.drawString(text, 15, 25); } }
G. Bruno
Slide 87
To see the applet in action, you need an HTML file with the Applet tag as follows:
<HTML> <BODY> <APPLET CODE=SimpleApplet.class WIDTH=200 HEIGHT=100> </APPLET> </BODY> </HTML>
G. Bruno
Slide 88
The init Method: The init method is called when the applet is first created and loaded by the underlying software.
The start Method: The start method is called when the applet is visited such as when the end user goes to a web page with an applet on it. After the start method executes, the event thread calls the paint method to draw to the applet's Panel. The stop and destroy Methods: The stop method stops the applet when the applet is no longer on the screen such as when the end user goes to another web page. The destroy method is called when the browser exits. The Graphics object passed to the paint method defines a graphics context for drawing on the Panel. The Graphics object has methods for graphical operations such as setting drawing colors, and drawing graphics, images, and text.
G. Bruno
Slide 89
Esempio LineApplet1
LineThread
in EsempiGUI
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 90
protected void processMouseEvent(MouseEvent e) Processes mouse events occurring on this component by dispatching them to any registered MouseListener objects. This method is not called unless mouse events are enabled for this component. Mouse events are enabled when one of the following occurs: A MouseListener object is registered via addMouseListener. Mouse events are enabled via enableEvents. public synchronized void addMouseListener(MouseListener l) Adds the specified mouse listener to receive mouse events from this component. public interface MouseListener mouseClicked(MouseEvent) Invoked when the mouse has been clicked on a component. mouseEntered(MouseEvent) Invoked when the mouse enters a component. mouseExited(MouseEvent) Invoked when the mouse exits a component. mousePressed(MouseEvent) Invoked when a mouse button has been pressed on a component. mouseReleased(MouseEvent) Invoked when a mouse button has been released on a component.
G. Bruno
Slide 91
Esempi
G. Bruno
Slide 92
package test;
import competenze.*;
public class TestCompetenze {
Tema n. 1
public static void main(String[] args) {Competenze comp = new Competenze(); try{ comp.newCompetenza("java"); comp.newCompetenza("c++"); comp.newCompetenza("uml"); comp.newCompetenza("client-server"); comp.newCompetenza("er"); comp.newAttivit("codifica1", "java"); comp.newAttivit("sviluppo1", "uml", "client-server", "java");
System.out.println(comp.elencoCompetenzePossedute());
// [uml: nA=1 nU=3, client-server: nA=1 nU=2, java: nA=2 nU=2, c++: nA=0 nU=1, er: nA=0 nU=1]
}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 93
Si implementino le classi usate nel programma di test precedente; tali classi si trovano nel package competenze. Note newCompetenza nomeCompetenza: genera un'eccezione se nomeCompetenza ripetuto;
Tema n. 1
newAttivit nomeAttivit, elenco competenze richieste: genera un'eccezione se nomeAttivit ripetuto oppure se una competenza nell'elenco non stata definita o ripetuta; newUtente nomeUtente, elenco competenze possedute: genera un'eccezione come nel caso precedente; elencoCompetenzeRichieste: stampa l'elenco delle competenze ordinate in modo decrescente in base al numero delle attivit richiedenti; a parit di n. richiedenti vale lordine alfabetico delle competenze; si usi un oggetto comparatore; elencoCompetenzePossedute: stampa l'elenco delle competenze ordinate in base al numero degli utenti possessori; stesse modalit del caso precedente; getAttivit getUtente Suggerimento In ogni oggetto Competenza si registrino il n. di attivit che la richiedono e il n. di utenti che la possiedono. Eccezioni: competenza ripetuta/inesistente, idem per attivit e utente Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 94
G. Bruno
Competenza
public String toString(){return nome + ":" + " nA=" + nA + " nU=" + nU;}
void incrNA() {nA++;} void incrNU() {nU++;} String getNome() {return nome;} int getNA() {return nA;} int getNU() {return nU;} }
G. Bruno
Slide 95
Attivit e Utente
class Attivit {
private String nome; private TreeSet<String> competenze; Attivit(String nome, TreeSet<String> competenze) {
CompEccezione
package competenze; @SuppressWarnings("serial")
G. Bruno
Slide 97
Competenze
Competenze
public void newAttivit(String nome, String... v) throws CompEccezione { TreeSet<String> s = new TreeSet<String>(); if (attivit.containsKey(nome)) throw new CompEccezione("attivit duplicata:" + nome); for (String c:v){ if (competenze.get(c) == null) throw new CompEccezione("competenza inesistente:" + c); else if (!s.add(c)) throw new CompEccezione("competenza duplicata:" + c); }
Competenze
if (utenti.containsKey(nome)) throw new CompEccezione("utente duplicato:" + nome); {if (competenze.get(c) == null) throw new CompEccezione("competenza inesistente:" + c); else if (!s.add(c)) throw new CompEccezione("competenza duplicata:" + c);} for (String c:v){competenze.get(c).incrNU();} Utente u = new Utente(nome, s); utenti.put(nome, u);}
Comparator<Competenza> comparator = new Comparator<Competenza>() { public int compare(Competenza c1, Competenza c2) {
Competenze
Progetto
Attivit
toS
nome
Competenze
nome
nome
Utente
toS
Competenza
toS
Attributi: Competenza: String nome, int nA, int nU. Attivit: String nome, TreeSet<String> competenze. Utente: nome, TreeSet<String> competenze. toS: la classe ridefinisce il metodo toString.
G. Bruno
Slide 102
Variante
Data una competenza elencare le attivit o gli utenti interessati.
G. Bruno
Slide 103
package test; import competenze1.*; public class TestCompetenze1 { public static void main(String[] args) {Competenze comp = new Competenze(); try{
TestCompetenze1
comp.newCompetenza("java"); comp.newCompetenza("c++"); comp.newCompetenza("uml");comp.newCompetenza("client-server"); comp.newCompetenza("er");comp.newAttivit("codifica1", "java"); comp.newAttivit("sviluppo1", "uml", "client-server", "java"); comp.newUtente("analista1", "uml", "er"); comp.newUtente("sviluppatore1", "uml", "client-server", "java"); comp.newUtente("sviluppatore2", "uml", "client-server", "java", "c++"); System.out.println(comp.getAttivit("sviluppo1").getInfo()); // sviluppo1[client-server, java, uml] System.out.println(comp.getUtente("analista1").getInfo()); // analista1[er, uml] System.out.println(comp.getCompetenza("java").getAttivit()); // attivit che richiedono java [codifica1, sviluppo1] System.out.println(comp.getCompetenza("java").getUtenti()); // utenti che possiedono java [sviluppatore1, sviluppatore2]
Progetto
Attivit
{ordered} toS
nome
Competenze
nome
nome
Utente
toS {ordered}
{ordered}
Competenza
toS
{ordered}
Attributi: Competenza: String nome. Attivit: String nome. Utente: nome. toS: la classe ridefinisce il metodo toString.
G. Bruno
Slide 105
package competenze1; competenze1.Competenza import java.util.*; public class Competenza implements Comparable<Competenza>{ private String nome; private TreeSet<Attivit> attivit = new TreeSet<Attivit>(); private TreeSet<Utente> utenti = new TreeSet<Utente>(); Competenza(String nome) {this.nome = nome;} public String toString(){return nome + ":" + " nA=" + attivit.size() + " nU=" + utenti.size();} String getNome() {return nome;} public int compareTo(Competenza c) {return nome.compareTo(c.nome);} void addAttivit(Attivit a){attivit.add(a);} void addUtente(Utente u){utenti.add(u);} public int getNA(){return attivit.size();} public int getNU(){return utenti.size();} public String getAttivit(){return "attivit che richiedono " + nome + " " + attivit.toString();} public String getUtenti(){return "utenti che possiedono " + nome + " " + utenti.toString();} }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 106
competenze1.Attivit
package competenze1;
import java.util.*; public class Attivit implements Comparable<Attivit>{ private String nome; private TreeSet<Competenza> competenze = new TreeSet<Competenza>(); Attivit(String nome) {this.nome = nome;} void addCompetenza(Competenza c){competenze.add(c);} public String toString(){return nome;} public String getInfo(){ TreeSet<String> s = new TreeSet<String>();
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 107
competenze1.Utente
package competenze1; import java.util.*;
package competenze1; competenze1.Competenze import java.util.*; public class Competenze { private Map<String,Competenza> competenze = new HashMap<String,Competenza>(); private Map<String,Attivit> attivit = new HashMap<String,Attivit>(); private Map<String,Utente> utenti = new HashMap<String,Utente>(); public void newCompetenza(String nome) throws CompEccezione { if (competenze.containsKey(nome)) throw new CompEccezione("competenza duplicata:" + nome); Competenza c = new Competenza(nome); competenze.put(nome, c);} privateTreeSet<Competenza> getCompetenze(String[] v) throws CompEccezione { TreeSet<Competenza> s = new TreeSet<Competenza>(); for (String c:v){ Competenza comp = competenze.get(c); if (comp == null) throw new CompEccezione("competenza inesistente:" + c); else if (!s.add(comp)) throw new CompEccezione("competenza duplicata:" + c); } return s;}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 109
competenze1.Competenze
public void newAttivit(String nome, String... v) throws CompEccezione { if (attivit.containsKey(nome)) throw new CompEccezione("attivit duplicata:" + nome); Attivit a = new Attivit(nome); attivit.put(nome, a); for (Competenza c: getCompetenze(v)) {a.addCompetenza(c); c.addAttivit(a);} } public void newUtente(String nome, String... v) throws CompEccezione { if (utenti.containsKey(nome)) throw new CompEccezione("utente duplicato:" + nome); Utente u = new Utente(nome); utenti.put(nome, u); for (Competenza c: getCompetenze(v)) {u.addCompetenza(c); c.addUtente(u);} } public Competenza getCompetenza (String nome) throws CompEccezione { Competenza c = competenze.get(nome); if(c == null) throw new CompEccezione("competenza inesistente:" + nome); else return c; }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 110
UML
UML (Unified Modeling Language) is a number of modeling languages/notations, not a global methodology. Textbook on UML: M. Fowler, UML distilled, Addison-Wesley. OMG standard (UML 2.0): http://www.omg.org Major kinds of diagrams Structural: class, object, package / diagram Behavioral: use case, activity, state, sequence / diagram OCL (Object Constraint Language)
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 111
Domain model
The system under consideration is made up of individuals called objects, and objects belong to classes. There are systematic links between objects and they are represented by links, called relationships, between their classes. Classes may have properties called attributes. A domain model shows the classes, attributes and relationships.
An object model is a particular realization of a class model: it shows a number of interrelated objects for illustrative purposes.
Domain model may also be called class models and information models. Domain model: high level (conceptual, business) perspective Class model: technical (implementation) perspective Information model: data base perspective
G. Bruno
Slide 112
Professor
teaches
Course
enrolledIn
teaches: relationship name (optional)
Student
G. Bruno
Slide 113
Constraints
A course is taught by one professor. Professors teach 1..3 courses. Students are enrolled in a number of courses. The minimum number of enrollees in a course is 10; the maximum is 50.
Professor
1 teaches
1..3
Course
+ enrolledIn
10..50
Student
G. Bruno
Slide 114
Multiplicity
How many associations a given object can be involved in?
Professor
1 teaches
1..3
Course
Meaning Zero or one One only Zero or more One or more Only n (where n > 1) Zero to n (where n > 1) m to n (where n > m)
G. Bruno
Slide 115
Book
1 Loan
G. Bruno
Slide 116
Composition
Objects can be made up of other objects. When a compound object is deleted, all its components are automatically deleted. A component exists only in connection with a container.
Product
OrderLine
+
An order is made up of order lines; each order line refers to a product and includes the number of units required.
Order
G. Bruno
Slide 117
Association class
Product Product OrderLine OrderLine Order
1
Order
OrderLine is an association class. Association classes enable attributes to be associated with relationships.
G. Bruno
Slide 118
Inheritance
A vehicle has exactly one owner that may be a person or a company. A vehicle may be a car or a motorcycle. Vehicle and Owner are abstract classes (they cannot be instantiated).
{abstract} Vehicle 1 {abstract} Owner class model
Car
Motorcycle
Person
Company
car1 person1
G. Bruno
motorcycle1
car2 company1
object model
Slide 119
Instances
Classes represent individuals, also called instances or objects. An object model shows a number of objects along with their attributes and associations.
G. Bruno
Slide 120
Recursive relationships
Node
successors predecessor 0..1
Node
successors
predecessors
tree
graph
Remark: predecessor, predecessors and successors are role names and associative attributes. In the tree model, given a node n, n.predecessor returns the predecessor node (which may be null) of n and n.successors returns the collection (which may be empty) of the successor nodes of n.
tree directed arcs
G. Bruno
a b c
graph
c
Slide 121
The class model represents an object-oriented program (e.g. a java program): the model classes are mapped to java classes, the attributes of the model classes are mapped to the attributes of the java classes, inheritance relationships are mapped to extend relationships between java classes, and the other relationships are mapped to single references or collections in the java classes.
G. Bruno
Slide 122
import biblioteca.*; public class TestPrestiti { public static void main(String[] args) { Biblioteca bib = new Biblioteca(); try{ Libro l1 = bib.newLibro("titolo1", 1);
Tema n. 2
bib.newLibro("titolo2", 2);
bib.newLibro("titolo3", 3); Utente u1 = bib.newUtente("utente1", 1); bib.newUtente("utente2", 3); int c1 = bib.newPrestito("utente1", "titolo1"); bib.restituzione("utente1", c1); int c2 = bib.newPrestito("utente1", "titolo3"); int c3 = bib.newPrestito("utente2", "titolo1"); }catch(BiblioEccezione e){System.out.println(e.getMessage());} System.out.println(bib.graduatoriaLibri()); //[titolo1:2, titolo3:1, titolo2:0]
System.out.println(bib.prestitiInCorso());}}
//[titolo1:100(utente2), titolo3:103(utente1)]
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 123
Si implementino le classi usate nel programma di test precedente; tali classi si trovano nel package biblioteca. Tutti gli attributi di tali classi devono essere privati. newLibro titolo, nVolumi: genera nVolumi disponibili per il libro dal titolo dato; produce uneccezione se titolo null oppure ripetuto o nVolumi <= 0. Ogni volume ha un numero progressivo univoco a partire da 100.
Tema n. 2
newUtente nome, maxVolumi: genera un utente con il nome dato e stabilisce il n. max di volumi che pu prendere in prestito simultaneamente; produce uneccezione se nome null oppure ripetuto o maxVolumi <= 0.
newPrestito utente, titolo: associa un volume all'utente e fornisce il codice del volume. Produce uneccezione se utente/titolo null oppure non esiste o lutente ha raggiunto il max numero di libri in prestito o non c alcun volume disponibile. restituzione utente, codice; restituisce il volume con il codice dato; produce uneccezione se utente null oppure non esiste o il codice non si riferisce ad un volume preso in prestito dallutente. graduatoriaLibri fornisce lelenco dei libri ordinati in base al n. dei prestiti totali e a parit di tale numero in base al titolo; si usi un comparator. prestitiInCorso fornisce lelenco dei volumi in prestito in corso ordinati in base al titolo e al codice del volume.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 124
{ordered nPrestiti}
Progetto
Utente
0..1
Libro
toS toS
Biblioteca
1 +
{ordered libro.titolo, codice}
Volume
Attributi
G. Bruno
Slide 125
package biblioteca; import java.util.*; public class Biblioteca { private Map<String,Libro> libri = new HashMap<String,Libro>();
Biblioteca
private Map<String,Utente> utenti = new HashMap<String,Utente>(); private Map<Integer,Volume> prestiti = new HashMap<Integer, Volume>(); private int nuovoCodice = 100; public Libro newLibro(String titolo, int nVolumi) throws BiblioEccezione { if (titolo == null || nVolumi <= 0) throw new BiblioEccezione ("newLibro: dati errati - " + titolo + " " + nVolumi); if (libri.containsKey(titolo)) throw new BiblioEccezione ("newLibro: libro duplicato - " + titolo); Libro l = new Libro(titolo, nVolumi, nuovoCodice); nuovoCodice += nVolumi;
G. Bruno
Slide 126
Biblioteca
public Utente newUtente(String nome, int maxVolumi) throws BiblioEccezione { if (nome == null || maxVolumi <= 0) throw new BiblioEccezione ("newUtente: dati errati - " + nome + " " + maxVolumi); if (utenti.containsKey(nome)) throw new BiblioEccezione ("newUtente: utente duplicato - " + nome); Utente u = new Utente(nome, maxVolumi);utenti.put(nome, u); return u;}
G. Bruno
Slide 127
public int newPrestito(String utente, String titolo) throws BiblioEccezione { if (titolo == null || utente == null)throw new BiblioEccezione ("newPrestito: dati errati - " + titolo + " " + utente); Utente u = utenti.get(utente);
Biblioteca
if (u == null) throw new BiblioEccezione ("newPrestito: utente non definito - " + utente);
if (!u.prestitoAmmissibile()) throw new BiblioEccezione ("newPrestito: max prestiti per " + utente); Libro l = libri.get(titolo); if (l == null) throw new BiblioEccezione("newPrestito: dati errati - " + titolo); Volume v = l.getVolume(); if (v == null) throw new BiblioEccezione("newPrestito: volume non disponibile - " + titolo); u.addVolume(v); v.setUtente(u); int c = v.getCodice(); prestiti.put(c, v); return c;}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 128
Biblioteca
public void restituzione(String utente, int codice) throws BiblioEccezione { Utente u = utenti.get(utente); if (u == null) throw new BiblioEccezione("restituzione: dati errati - " + utente);
Volume v = prestiti.get(codice);
if (v == null || u != v.getUtente()) throw new BiblioEccezione ("restituzione: dati errati");
v.clearUtente(); u.removeVolume(v);
prestiti.remove(codice); }
G. Bruno
Slide 129
public String graduatoriaLibri() { public int compare(Libro l1, Libro l2) { if (l2.getNPrestiti() == l1.getNPrestiti())
Biblioteca
return l1.getTitolo().compareTo(l2.getTitolo());
if (l2.getNPrestiti() > l1.getNPrestiti()) return 1; else return -1;
}};
List<Libro> list1 = new ArrayList<Libro>(libri.values()); Collections.sort(list1, ordine); return list1.toString();} public String prestitiInCorso(){ List<Volume> list1 = new ArrayList<Volume>(prestiti.values());
package biblioteca; public class Libro { private String titolo; private int nPrestiti = 0; private Volume[] volumi; Libro(String titolo, int n, int nuovoCodice){ this.titolo = titolo; volumi = new Volume[n]; for (int i = 0; i < volumi.length; i++) volumi[i] = new Volume(this, nuovoCodice++); } String getTitolo(){return titolo;} int getNPrestiti() {return nPrestiti;} Volume getVolume() { for (int i = 0; i < volumi.length; i++){ Volume v = volumi[i]; if (v.getDisp()) {nPrestiti ++; return v;} } return null;} public String toString(){return titolo + ":" + nPrestiti;}}
Libro
G. Bruno
Slide 131
package biblioteca; public class Volume implements Comparable<Volume>{ private int codice; private Libro libro; private Utente utente; Volume(Libro l, int nuovoCodice){libro = l; codice = nuovoCodice;}
Volume
void setUtente(Utente u) {utente = u;} void clearUtente() {utente = null;} boolean getDisp () {return utente == null;} int getCodice(){return codice;} Libro getLibro() {return libro;}
G. Bruno
Slide 132
package biblioteca;
import java.util.*; public class Utente {
Utente
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 133
BiblioEccezione
package biblioteca; @SuppressWarnings("serial")
G. Bruno
Slide 134
GUI
Si progetti uninterfaccia grafica (attributi e metodo actionPerformed della classe GUI) che consenta luso del package di cui al punto 1. I pulsanti corrispondono alle operazioni definite al punto 1. Ad esempio, detti t1 e t2 i valori inseriti nelle due caselle di testo, newLibro inserisce il libro con titolo t1 e con n. volumi pari a t2. Eventuali eccezioni sono mostrate nellarea di testo. Larea di testo mostra la conferma done nel caso di newLibro, newUtente e restituzione se loperazione andata a buon fine, il codice del prestito nel caso di newPrestito, il risultato della query negli altri casi. La figura precedente presenta il risultato di graduatoriaLibri.
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 135
package test; public class GUITestPrestiti extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextArea ta; private JTextField tf1; private JTextField tf2; private Biblioteca bib = new Biblioteca(); public static final String LIBRO = "newLibro"; public static final String UTENTE = "newUtente";
GUI
G. Bruno
Slide 136
public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true); GUITestPrestiti gui = new GUITestPrestiti(); gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gui.pack(); gui.setVisible(true);} private void addButton(String label, JPanel panel, ActionListener listener){ JButton button = new JButton(label); button.addActionListener(listener); panel.add(button);} private JTextField addTF(String label, int length, JPanel panel){ JTextField tf = new JTextField(label,length); tf.setBackground(Color.white); panel.add(tf); return tf;}
GUI
G. Bruno
Slide 137
public GUITestPrestiti() {
setTitle("Prestiti");
Container contentPane = getContentPane(); JPanel buttonPanel = new JPanel(); buttonPanel.setBackground(Color.white); addButton(LIBRO,buttonPanel,this); addButton(UTENTE,buttonPanel,this); addButton(PRESTITO,buttonPanel,this); addButton(RESTITUZIONE,buttonPanel,this); addButton(INCORSO,buttonPanel,this); addButton(GRAD,buttonPanel,this); contentPane.add(buttonPanel, BorderLayout.SOUTH); JPanel textPanel = new JPanel(); textPanel.setBackground(Color.blue); ta = new JTextArea(LINES, CHAR_PER_LINE); ta.setBackground(Color.white); textPanel.add(ta); contentPane.add(textPanel, BorderLayout.CENTER); JPanel textFPanel = new JPanel(); textFPanel.setBackground(Color.white); tf1 = addTF("", 20, textFPanel); tf2 = addTF("", 10, textFPanel);
GUI
contentPane.add(textFPanel, BorderLayout.NORTH); }
G. Bruno
Slide 138
public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); ta.setText(""); String s1 = tf1.getText(); String s2 = tf2.getText(); try{ if (actionCommand.equals(LIBRO)){ bib.newLibro(s1, Integer.parseInt(s2)); ta.setText("done");} else if (actionCommand.equals(UTENTE)) { bib.newUtente(s1, Integer.parseInt(s2)); ta.setText("done");} else if (actionCommand.equals(PRESTITO)) {
GUI
}catch(BiblioEccezione ex){ta.setText(ex.getMessage());}
catch(NumberFormatException ex){ta.setText(ex.getMessage());}}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 139
import voli.*; public class TestVoli { public static void main(String[] args) { try{ Voli vi = new Voli(); Aereo a1 = vi.addAereo("a1", "aereo a1", 100);
Tema n. 3
Tema n. 3
Il programma riguarda la gestione delle prenotazioni di voli giornalieri nellambito di una settimana. addAereo codiceAereo, descrizione, numeroPosti
Voli
1 C
Progetto
Volo
toS 1
Aereo
toS
toS
Volo Giornaliero
Volo: String codiceVolo, String luogoPartenza, String luogoArrivo, int oraPartenza, int oraArrivo.
VoloGiornaliero: Volo volo; int giorno, TreeSet(String) prenotazioni.
G. Bruno
Slide 142
package voli; import java.util.*; public class Voli { private Map<String, Aereo> aerei = new HashMap<String, Aereo>(); private Map<String, Volo> voli = new HashMap<String, Volo>(); public Aereo addAereo(String codiceAereo, String descrizione, int numeroPosti) throws VoliEx{ if (codiceAereo == null || numeroPosti <= 0 || aerei.containsKey(codiceAereo)) throw new VoliEx("dati errati in addAereo: " + codiceAereo); Aereo a1 = new Aereo(codiceAereo, descrizione, numeroPosti); aerei.put(codiceAereo, a1); return a1;}
Voli
G. Bruno
Slide 143
public void addVolo(String codiceVolo, String codiceAereo, String luogoPartenza, int oraPartenza, String luogoArrivo, int oraArrivo) throws VoliEx { if (codiceVolo == null || voli.containsKey(codiceVolo) || luogoPartenza == null || luogoArrivo == null || oraPartenza < 1 || oraPartenza > 24 || oraArrivo < 1 || oraArrivo > 24 || oraPartenza >= oraArrivo || !aerei.containsKey(codiceAereo)) throw new VoliEx("dati errati in addVolo: " + codiceVolo); Aereo a = aerei.get(codiceAereo); Volo v1 = new Volo(codiceVolo, a, luogoPartenza, oraPartenza, luogoArrivo, oraArrivo); a.addVolo(v1);//verifica sovrapposizione voli su aereo voli.put(codiceVolo, v1); }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 144
Voli
public void addPrenotazione(String codiceVolo, String passeggero, int giorno) throws VoliEx {
} public VoloGiornaliero getVoloGiornaliero(String codiceVolo, int giorno) throws VoliEx { if (codiceVolo == null || giorno < 1 || giorno > 7 || !voli.containsKey(codiceVolo)) throw new VoliEx("dati errati in getVoloGiornaliero: " + codiceVolo); Volo v1 = voli.get(codiceVolo); return v1.getVoloGiornaliero(giorno); }}
Voli
getVoloGiornaliero(codiceVolo, giorno).addPrenotazione(passeggero);
G. Bruno
Slide 145
package voli; import java.util.*; public class Aereo { private String codiceAereo; private String descrizione;
Aereo
package voli; public class Volo implements Comparable<Volo> { private String codiceVolo; private String luogoPartenza; private String luogoArrivo; private int oraPartenza; private int oraArrivo; private Aereo aereo; private VoloGiornaliero[] voliGiornalieri; String getCodiceVolo() {return codiceVolo;} Aereo getAereo() {return aereo;} Volo(String codiceVolo, Aereo aereo, String luogoPartenza, int oraPartenza, String luogoArrivo, int oraArrivo){ this.codiceVolo = codiceVolo; this.aereo = aereo; this.luogoPartenza = luogoPartenza; this.oraPartenza = oraPartenza; this.luogoArrivo = luogoArrivo; this.oraArrivo = oraArrivo; voliGiornalieri = new VoloGiornaliero[7]; for (int g = 0; g < 7; g++) voliGiornalieri[g] = new VoloGiornaliero(this, g);}
Volo
G. Bruno
Slide 147
Volo
public int compareTo(Volo v2){ if (this.oraArrivo < v2.oraPartenza) return -1;
G. Bruno
Slide 148
package voli; import java.util.*; public class VoloGiornaliero { private TreeSet<String> prenotazioni; private Volo volo; private int giorno; VoloGiornaliero(Volo volo, int giorno){this.volo = volo; this.giorno = giorno; prenotazioni = new TreeSet<String>();} public String toString(){ return giorno + " " + volo.toString() +" " + prenotazioni;} void addPrenotazione(String passeggero) throws VoliEx{ if (prenotazioni.size() == volo.getAereo().getNumeroPosti()) throw new VoliEx("volo completo:" + volo.getCodiceVolo() + ":" + giorno); if (!prenotazioni.add(passeggero)) throw new VoliEx("prenotazione duplicata:" + volo.getCodiceVolo() + ":" + giorno + " " + passeggero); }}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
VoloGiornaliero
Slide 149
VoliEx
package voli; public class VoliEx extends Exception {
G. Bruno
Slide 150
G. Bruno
Slide 151
for(ElementoNutritivo e : alimenti.materiePrime()){
TestDieta
}
//Mais cal: 70.0 //Nutella cal: 530.0 //Olio cal: 900.0 //Pasta cal: 350.0 //Zucchero cal: 400.0
G. Bruno
Slide 152
R1 - Materie Prime
Si interagisce con il sistema tramite la classe Alimenti.
Requisiti
Per definire una materia prima, si utilizza il metodo definisciMateriaPrima() che riceve come parametri il nome, le calorie, le proteine, i carboidrati e i grassi, tutti riferiti a 100 grammi di materia prima. Per avere informazioni sulle materie prime, si utilizza il metodo materiePrime() che restituisce la collezione delle materie prime in ordine alfabetico. Per ottenere le informazioni su una specifica materia prima ci si avvale del metodo getMateriaPrima() che riceve come parametro il nome e restituisce la materia prima corrispondente. Gli elementi restituiti dai due metodi precedenti implementano l'interfaccia ElementoNutritivo.
G. Bruno
Slide 153
TestDieta
alimenti.definisciProdotto("Cono gelato", 400, 2.6, 17.2, 3.5); System.out.println("media cal. prodotti " + alimenti.mediaCalorieProdotti()); //media cal. prodotti 255.5 alimenti.definisciMenu("Menu 1"); alimenti.aggiungiProdotto("Menu 1", "Cracker", 2); alimenti.aggiungiMateriaPrima("Menu 1", "Pasta", 100); alimenti.aggiungiMateriaPrima("Menu 1", "Nutella", 50);
G. Bruno
Slide 154
Requisiti
R2 - Prodotti
Il sistema tratta anche prodotti preconfezionati (ad esempio un cono gelato). I prodotti vengono definiti tramite il metodo definisciProdotto() della classe Alimenti che riceve parametri come quelli delle materie prime. Per avere informazioni sui prodotti si utilizza il metodo prodotti() della classe Alimenti che restituisce la collezione dei prodotti in ordine alfabetico.
Per ottenere le informazioni su uno specifico prodotto ci si avvale del metodo getProdotto() della classe Alimenti che riceve come parametro il nome e restituisce il prodotto corrispondente.
Gli elementi restituiti dai due metodi precedenti implementano l'interfaccia ElementoNutritivo; i valori sono espressi per prodotto (non per 100 grammi).
G. Bruno
Slide 155
Requisiti
R3 - Statistiche Il metodo materiePrimePerCalorie() restituisce una collezione contenente le materie prime ordinate per calorie crescenti. Inoltre presente il metodo mediaCalorieProdotti() che restituisce la media aritmetica delle calorie dei prodotti.
G. Bruno
Slide 156
Requisiti
R4 - Menu Un menu composto da porzioni di materie prime e da prodotti preconfezionati. Pre creare un menu si utilizza il metodo definisciMenu() che riceve come parametro il nome del menu. Per aggiungere una porzione di materia prima si usa il metodo aggiungiPorzione() che riceve come parametri il nome del menu, il nome di una materia prima e la dimensione della porzione in grammi; se il nome non corrisponde ad alcuna materia prima viene generata un'eccezione (MateriaPrimaInesistente). Per aggiungere un prodotto preconfezionato si usa il metodo aggiungiProdotto() che riceve come parametri il nome del menu, il nome di un prodotto e il n. di unit; se il nome non corrisponde ad alcun prodotto viene generata un'eccezione (ProdottoInesistente). Infine, il metodo getMenu() riceve come parametro il nome di un menu e restituisce un oggetto che implementa l'interfaccia ElementoNutritivo; in questo caso i valori restituiti si riferiscono al totale del menu e non ai 100 grammi. Se il nome non corrisponde ad alcun menu viene generata un'eccezione (MenuInesistente).
G. Bruno
Slide 157
TestDieta
//Calorie
//Grassi //Proteine
: 837,00
: 24,00 : 20,60
//Carboidrati : 134,60
System.out.println(menu);
//Menu 1[Cracker: 2.0, Pasta: 100.0, Nutella: 50.0]
}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 158
Dieta
package dieta; public interface ElementoNutritivo {
String getNome();
double getCalorie(); double getProteine();
double getCarboidrati();
double getGrassi(); }
G. Bruno
Slide 159
File MateriePrime.txt
Latte_scremato 34.0 3.30 5.10 0.05 Zucchero 400 0 100 0
G. Bruno
Slide 160
Requisiti
R5 - Lettura da file Deve essere possibile leggere le informazioni sulle materie prime da file tramite il metodo leggiMateriePrime() della classe Alimenti. Tale metodo riceve come parametri il path del file contenente le informazioni. Il file un file testuale che contiene una materia prima per ogni riga, le materie prime sono descritte con nome, calorie, proteine, carboidrati e grassi separati da spazi. In caso di dati errati su una riga, il metodo deve scartare la linea e procedere con quelle successive.
G. Bruno
Slide 161
package test;
TestDieta1
}}
G. Bruno
Slide 162
materiePrime, prodotti
Modello
Alimenti
Elemento Nutritivo
Attributi Alimento: String nome; double calorie, proteine, carboidrati, grassi. In Menu gli attributi calorie, proteine, carboidrati, grassi contengono le somme dei contributi dei componenti.
Alimento Quantita
Menu
menus
G. Bruno
Slide 163
Alimento
package dieta;
class Alimento implements ElementoNutritivo, Comparable<Alimento> { protected String nome; protected double calorie; protected double proteine; protected double carboidrati; protected double grassi; public double getCalorie() {return calorie;} public double getCarboidrati() {return carboidrati;} public double getGrassi() {return grassi;} public String getNome() {return nome;}
G. Bruno
Slide 164
Alimento
Alimento(String nome, double calorie, double proteine, double carboidrati, double grassi) { this.nome = nome; this.calorie = calorie; this.proteine = proteine; this.carboidrati = carboidrati; this.grassi = grassi; }
G. Bruno
Slide 165
Menu
private List<Quantita> componenti = new ArrayList<Quantita>(); public Menu(String nome) {super(nome);} private class Quantita { Alimento a; double quantita; Quantita (Alimento e, double quantita) { this.a = e; this.quantita = quantita; } public String toString() {return a.getNome() + ": " + quantita;} }
G. Bruno
Slide 166
Menu
aggiungi(a, quantita);}
void aggiungiProdotto(Alimento a, double quantita) { componenti.add(new Quantita(a, quantita));
Alimenti
TreeMap<String, Alimento> materiePrime = new TreeMap<String, Alimento>(); TreeMap<String, Alimento> prodotti = new TreeMap<String, Alimento>(); TreeMap<String, Menu> menus = new TreeMap<String, Menu>(); public void definisciMateriaPrima (String nome, double kcal,
G. Bruno
Slide 168
Alimenti
public ElementoNutritivo getMateriaPrima (String nome)throws Exception{ ElementoNutritivo a = materiePrime.get(nome); if (a == null) throw new Exception(Eccezioni.MATERIAPRIMAINESISTENTE.toString()); return a;}
G. Bruno
Slide 169
public void definisciProdotto (String nome, double kcal, double proteine, double carboidrati, double grassi){
Alimenti
prodotti.put(nome, new Alimento(nome, kcal, proteine, carboidrati, grassi));} public Collection<? extends ElementoNutritivo> prodotti (){ return prodotti.values();} public ElementoNutritivo getProdotto (String nome)throws Exception{ ElementoNutritivo a = prodotti.get(nome); if (a == null) throw new Exception(Eccezioni.PRODOTTOINESISTENTE.toString());
return a;}
public double mediaCalorieProdotti (){ double media = 0;
public void definisciMenu(String nome){menus.put(nome, new Menu(nome));} throws Exception{ Menu m = menus.get(menu);
Alimenti
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 171
Alimenti
public ElementoNutritivo getMenu(String nome) throws Exception{
Menu m = menus.get(nome);
if (m == null) throw new Exception(Eccezioni.MENUINESISTENTE.toString());
return m;
}
G. Bruno
Slide 172
public void leggiMateriePrime(String fileName) throws IOException { String line1 = null; BufferedReader in = new BufferedReader(new FileReader(fileName)); line1 = in.readLine(); while (line1 != null) { try {Scanner sc = new Scanner(line1); sc.useLocale(Locale.US); //sc.useDelimiter("\\s*;\\s*"); // se il sep. fosse ; tra spazi
Alimenti
}}
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 173
Eccezioni
package dieta;
enum Eccezioni {
MATERIAPRIMAINESISTENTE, PRODOTTOINESISTENTE, MENUINESISTENTE
G. Bruno
Slide 174
G. Bruno
Slide 175
Pubblicazioni
R2 - Riviste Per inserire delle riviste nel sistema si utilizza il metodo addRivista() che riceve come parametri il codice ISSN, il nome della rivista e l'Impact Factor, che un indice che rappresenta la bont della rivista. Il metodo restituisce un oggetto di classe Rivista, la quale offre i metodi getTitolo() e getIF() per accedere al titolo e all'Impact Factor della rivista. Per poter ottenere una rivista specifica si utilizza il metodo getRivista() che riceve come parametro il codice ISSN. Mentre il metodo getRiviste() restituisce la lista delle riviste in ordine di Impact Factor decrescente. R3 - Articoli Gli articoli pubblicati sulle riviste vengono inseriti tramite il metodo addArticolo() della classe Rivista che riceve come parametri il titolo dell'articolo e l'autore, il metodo restituisce un oggetto di classe Articolo. Il titolo accessibile tramite il metodo getTitolo(). Per inserire articoli con pi autori si utilizza la versione dello stesso metodo che riceva come ultimo parametro un array di autori. Per ottenere l'elenco degli autori si utilizza il metodo elencoAutori(). possibile sapere il numero degli articoli pubblicati da un dato ricercatore tramite il metodo numArticoli() della classe Ricercatore.
G. Bruno
Slide 176
R4 - Indici e citazioni
Si devono poter calcolare due diversi indici di produttivit dei ricercatori. Il metodo sommaIF() della classe Ricercatore calcola la somma degli Impact Factor delle riviste per ogni articolo pubblicato dal ricercatore. Il metodo cita() della classe Articolo riceve come parametro un articolo e permette di definire una citazione ad esso. Ad esempio a1.cita(a2); inserisce una nuova citazione dell'articolo a2 da parte dell'articolo a1. Il numero di citazioni di un articolo ottenibile tramite il metodo numCitazioni(). Il metodo hIndex() della classe Ricercatore calcola l'h-index dell'autore nel modo seguente: si ordinano gli articoli dell'autore in ordine decrescente per numero di citazioni h-index = max( i | citazioni(articoli[i]) >= i ) se un ricercatore non ha articoli, oppure se i suoi articoli hanno n. di citazioni = 0, allora il suo hIndex vale 0.
Quindi se un autore ha h-Index n vuol dire che n articoli di cui autore hanno ricevuto almeno n citazioni. Ad esempio dati i seguenti articoli, l'h-index = 4.
Pos. 1 2 3 4 5 Articolo Art y Art z Art s Art x Art t Num citazioni 50 40 10 5 4
Pubblicazioni
G. Bruno
Slide 177
R5 - Lettura da file
Pubblicazioni
possibile leggere i dati relativi alla ricerca da un file di testo organizzato come segue tramite il metodo leggi(). Gli elementi sono memorizzati per righe ed il loro tipo definito dalla prima lettera della linea. I dati degli elementi sono separati da ';'. I ricercatori sono identificati dalla 'R', seguita dal codice, nome e cognome. Le riviste sono identificate dalla 'J', seguita dall'ISSN, il nome, e dall'Impact Factor. Gli articoli sono identificati dalla 'A', seguita dal titolo, dal codice dell'autore (non si considerano i casi di autori multipli) e dal numero di citazioni. In caso di errore su una linea il metodo deve ignorare la linea e proseguire la lettura del file. Esempio: R;123;Albert;Einstein J;0031-9007;Physical Review Letters;7.072
G. Bruno
Slide 178
import ricerca.*; public class Example { public static void main(String[] args) { Valutazione v = new Valutazione(); Advances in Physics 9.571 Ricercatore ae = v.addRicercatore("123","Albert","Einstein"); Physical Review Letters 7.072 Ricercatore ef = v.addRicercatore("432","Enrico","Fermi"); Fermi ha pubblicato 2 Einstein ha pubblicato 2 Ricercatore nb = v.addRicercatore("123","Niels","Bohr"); Einstein ha totalizzato 16.643 Ricercatore[] autori1 = {ef, nb}; Rivista pr = v.addRivista("0031-9007","Physical Review Letters",7.072); Rivista ap = v.addRivista("0001-8732","Advances in Physics",9.571); for (Rivista r: v.getRiviste()) System.out.println(r.getTitolo() + " " + r.getIF()); Articolo a1 = pr.addArticolo("Teoria della relativita ristretta",ae); Articolo a2 = ap.addArticolo("Teoria della relativita generale",ae); Articolo a3 = ap.addArticolo("Teoria e pratica della fissione",ef); Articolo a4 = pr.addArticolo("Un modello dell'atomo",nb); Articolo a5 = pr.addArticolo("Titolo5", autori1); System.out.println(ef.getLast() + " ha pubblicato " + ef.numArticoli()); System.out.println(ae.getLast() + " ha pubblicato " + ae.numArticoli()); System.out.println(ae.getLast() + " ha totalizzato " + ae.sommaIF());
Valutazione
G. Bruno
Slide 179
a4.cita(a1); a3.cita(a1); a1.cita(a2); a4.cita(a2); a3.cita(a2); a3.cita(a4); System.out.println(ae.getLast() + " ha h-index " + ae.hIndex()); for (Articolo a: ae.elencoArticoli()) System.out.println(a.getTitolo() + " " + a.numCitazioni());
Valutazione
v = new Valutazione(); v.leggi("datiRicerca"); for (Rivista r: v.getRiviste()) System.out.println(r.getTitolo() + " " + r.getIF()); ae = v.getRicercatore("123"); System.out.println(ae.getLast() + " ha pubblicato " + ae.numArticoli()); System.out.println(ae.getLast() + " ha h-index " + ae.hIndex());}}
Einstein ha h-index 2 Teoria della relativita ristretta 3 Teoria della relativita generale 2 Physical Review Letters 7.072 Einstein ha pubblicato 1 Einstein ha h-index 1
G. Bruno
Slide 180
datiRicerca
R;123;Albert;Einstein J;0031-9007;Physical Review Letters;7,072
G. Bruno
Slide 181
Valutazione
Ricercatore
autori
Valutazione
Rivista C
1
Articolo
Attributi Ricercatore: String codice, first, last. Rivista: String codice, nome; double impactFactor. Articolo: String titolo; AL autori; int nCitazioni.
G. Bruno
Slide 182
package ricerca; import java.util.*; import java.util.Collection; public class Ricercatore { private String codice; private String first; private String last; ArrayList<Articolo> articoli = new ArrayList<Articolo>();
Ricercatore
Ricercatore(String codice, String first, String last) { this.codice = codice; this.first = first; this.last = last;} public String getCodice(){return codice;} public String getFirst(){return first;} public String getLast(){return last;} public int numArticoli() {return articoli.size();}
G. Bruno
Slide 183
Ricercatore
void addArticolo(Articolo a) {articoli.add(a);} public double sommaIF() { double f = 0; for (Articolo a: articoli) f += a.getRivista().getIF(); return f;} public int hIndex() { int i = 1; int val = 0; for (Articolo a: articoli) if (a.numCitazioni() < i) return val; else val = i++; return val;} public Collection<Articolo> elencoArticoli(){ return articoli;} }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 184
package ricerca; Rivista import java.util.*; @SuppressWarnings("unused") public class Rivista implements Comparable <Rivista>{ private String issn; private String title; private double impactFactor; ArrayList<Articolo> articoli = new ArrayList<Articolo>(); Rivista (String issn, String title, double impactFactor) { this.issn = issn; this.title = title; this.impactFactor = impactFactor;} public String getTitolo(){return title;} public double getIF(){return impactFactor;} public Articolo addArticolo(String titolo, Ricercatore ricercatore) { Articolo a = new Articolo(titolo, ricercatore, this); articoli.add(a); ricercatore.addArticolo(a); return a;}
G. Bruno
Slide 185
public Articolo addArticolo(String titolo, Ricercatore ricercatore, int n) { Articolo a = new Articolo(titolo, ricercatore, this, n); articoli.add(a); ricercatore.addArticolo(a); return a;} public Articolo addArticolo(String titolo, Ricercatore[] ricercatori) { Articolo a = new Articolo(titolo, ricercatori, this); articoli.add(a); for (Ricercatore r: ricercatori) r.addArticolo(a); return a;}
public int compareTo(Rivista r) { if (this.impactFactor == r.impactFactor) return 0; else if (this.impactFactor < r.impactFactor) return 1; else return -1; }
Rivista
G. Bruno
Slide 186
Articolo
package ricerca; import java.util.*; public class Articolo implements Comparable <Articolo> { private String titolo; private int n = 0;private Rivista r; Collection<Ricercatore> autori = new ArrayList<Ricercatore>();
Articolo (String titolo, Ricercatore ricercatore, Rivista r) { this.titolo = titolo; this.autori.add(ricercatore); this.r = r;} Articolo (String titolo, Ricercatore[] ricercatori, Rivista r) { this.titolo = titolo; this.autori = Arrays.asList(ricercatori); this.r = r;} Articolo (String titolo, Ricercatore ricercatore, Rivista r, int n) { this.titolo = titolo; this.autori.add(ricercatore); this.r = r; this.n = n;} public Rivista getRivista(){return r;}
Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 187
G. Bruno
Articolo
public String getTitolo(){return titolo;} public Collection<Ricercatore> elencoAutori(){return autori;} public void cita(Articolo citato) {citato.n++;} public int numCitazioni(){return n;} public int compareTo(Articolo a) { if (this.n == a.n) return 0; else if (this.n < a.n) return 1; else return -1; } }
G. Bruno
Slide 188
Valutazione
G. Bruno
Slide 189
public Collection<Rivista> getRiviste(){ List<Rivista> list1 = new ArrayList<Rivista>(riviste.values()); Collections.sort(list1); return list1;}
G. Bruno
Slide 190
public void leggi(String fileName) { try{String line1 = null; BufferedReader in = new BufferedReader(new FileReader(fileName)); line1 = in.readLine(); while (line1 != null) { try { Scanner sc = new Scanner(line1).useDelimiter(";"); String l = sc.next(); if (l.equals("R")) { String id = sc.next(); String first = sc.next(); String last = sc.next(); addRicercatore(id, first, last); } else if (l.equals("J")) { String issn = sc.next(); String title = sc.next(); double impactFactor = sc.nextDouble(); addRivista(issn, title, impactFactor); } else if (l.equals("A")) { String issn = sc.next(); String title = sc.next(); String id = sc.next(); int n = sc.nextInt(); Rivista r = getRivista(issn); Ricercatore ricercatore = getRicercatore(id); r.addArticolo(title, ricercatore, n); } }
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12
Valutazione
Slide 191
Valutazione
catch (Exception e) { //e.printStackTrace(); } line1 = in.readLine(); }; in.close(); } catch (Exception e) { //e.printStackTrace(); } } }
G. Bruno
Slide 192
G. Bruno
gare.newPunteggio("Giro delle Fiandre", "Miguel", 10); gare.newPunteggio("Giro delle Fiandre", "Francesco", 8); //oppure se ciclista o tempo gi inseriti gare.newPunteggio("Giro delle Fiandre", "Eddy", 9); gare.newPunteggio("Parigi Roubaix", "Eddy", 10); gare.newPunteggio("Parigi Roubaix", "Francesco", 7); System.out.println("classifica Giro delle Fiandre");
Gare
System.out.println("classifica generale");
for (ElementoDiClassifica e: gare.getClassificaGenerale()) System.out.println(e.getNome() + " " + e.getValore());
Gare
System.out.println("classifica a squadre");
for (ElementoDiClassifica e: gare.getClassificaSquadre()) System.out.println(e.getNome() + " " + e.getValore());
System.out.println(gare.getPiazzamenti("Eddy"));
} catch(Exception e){System.out.println(e.getMessage());}}
classifica generale Eddy 19 Francesco 15 Miguel 10 classifica per squadre Olmo 25 Bianchi 19 piazzamenti di Eddy: Parigi Roubaix.10 Giro delle Fiandre.9
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 195
Gare
int getValore();
}
G. Bruno
Slide 196
Gare
1
Gare
Squadra
Gara
Atleta
Punteggio
Atleta e Squadra sono Attributi comparabili. Gara: String nome. Atleta: String nome. Atleta e Gara ordinano i Squadra: String nome. punteggi associati. Punteggio: int p. Attributi derivati: Atleta: int punti (punti totali per la classifica generale). Squadra: int punti (punti totali per la classifica a squadre).
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 197
Squadra
package gare; public class Squadra implements ElementoDiClassifica, Comparable<Squadra> { private String nome; private int punti; public Squadra(String nome) {this.nome = nome;} // impl. ElementoDiClassifica public String getNome() {return nome;} public int getValore() {return punti;} void addPunteggio(int i) {punti += i;} public int compareTo(Squadra s) { if (punti == s.punti) nome.compareTo(s.nome); return s.punti - punti; } }
G. Bruno
Slide 198
package gare;
Punteggio
}
//public Atleta getAtleta() {return atleta;} public Gara getGara() {return gara;}
//impl. ElementoDiClassifica
public String getNome() {return atleta.getNome();} public int getValore() {return p;}
package gare; Atleta import java.util.*; public class Atleta implements ElementoDiClassifica, Comparable<Atleta> { private String nome; private Squadra squadra; private int punti; //attributo derivato Comparator<Punteggio> comp = new Comparator<Punteggio>() { //serve per ordinare i punteggi public int compare(Punteggio p1, Punteggio p2) { if(p1.getValore() == p2.getValore()) return p1.getGara().getNome().compareTo(p2.getGara().getNome()); return p2.getValore() - p1.getValore(); } }; private TreeSet<Punteggio> punteggi = new TreeSet<Punteggio>(comp);
G. Bruno
Slide 200
public Atleta(String nome, Squadra squadra) { Atleta this.nome = nome; this.squadra = squadra;} public void addPunteggio(Punteggio p) { punteggi.add(p); punti += p.getValore(); squadra.addPunteggio(p.getValore());} // impl. ElementoDiClassifica public String getNome() {return nome;} public int getValore() {return punti;} // impl. Comparable<Atleta> public int compareTo(Atleta a) { if (punti == a.punti) return nome.compareTo(a.nome); return a.punti - punti;} public String getPiazzamenti() { StringBuffer b = new StringBuffer("piazzamenti di " + nome+ ":"); for (Punteggio p: punteggi) b.append(" " +p.getGara().getNome()+"."+p.getValore()); return b.toString();}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 201
package gare;
import java.util.*;
public class Gara { private String nome;
Gara
return punteggi;}
public String getNome() {return nome;}}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 202
Gare
private Map<String, Atleta> atleti = new TreeMap<String, Atleta>(); private Map<String, Gara> gare = new HashMap<String, Gara>(); private Map<String, Squadra> squadre = new HashMap<String, Squadra>(); public void newAtleta(String nome, String nomeSquadra) throws Exception { if (atleti.get(nome)!=null) throw new Exception("atleta! " + nome); Squadra squadra = squadre.get(nomeSquadra); if (squadra == null) { squadra = new Squadra(nomeSquadra); squadre.put(nomeSquadra, squadra); } atleti.put(nome, new Atleta(nome, squadra));}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 203
Gare
public void newPunteggio(String nomeGara, String nomeAtleta, int punti) throws Exception {
}
G. Bruno Programmazione ad oggetti, PoliTo, a.a. 2011-12 Slide 204
public Collection<? extends ElementoDiClassifica> getClassificaSquadre() { ArrayList<Squadra> classifica = new ArrayList<Squadra>(squadre.values()); Collections.sort(classifica); return classifica; } public Collection<? extends ElementoDiClassifica> getClassificaGenerale() { ArrayList<Atleta> classifica = new ArrayList<Atleta>(atleti.values()); Collections.sort(classifica); return classifica;} public Collection<? extends ElementoDiClassifica> getClassifica(String nomeGara)throws Exception { Gara gara = gare.get(nomeGara); if (gara==null) throw new Exception("gara? " + nomeGara); return gara.getClassifica(); } public String getPiazzamenti(String nomeAtleta) throws Exception { Atleta atleta = atleti.get(nomeAtleta); if (atleta==null) throw new Exception("atleta? " + nomeAtleta); return atleta.getPiazzamenti();} }
Gare
G. Bruno
Slide 205