Interfacce Interfacce Un interface è una collezione di firme di metodi (senza implementazione). Una interfaccia può dichiarare costanti. Interfacce C1 I1 C2 I2 Esempio di interface package strutture; public interface Stack{ public int estrai(); public void insert(int z); } package strutture; public class Pila implements Stack{ … } package strutture; public class Coda extends Pila{ … } Interfacce Le interfacce possono essere usate come C1 I1 I2 “tipi” I1 x = new C2(); // I1 x = new I1(); NO!! C2 public static void main(String args[]) { try { Usare Stack s=null; Pile e int type=0; do { Code try { type =Integer.parseInt( JOptionPane.showInputDialog( "Pila (1) o Coda (2)?")); } catch (Exception e) {type=0;} } while (type<1 || type>2); switch (type) { case 1: s=new Pila(); break; case 2: s=new Coda(); break; } … } Collections Collections Una collection è un oggetto che ragguppa elementi multipli (anche eterogenei) in una singola entità. Collections sono usate per immagazzinare, recuperare e trattare dati, e per trasferire gruppi di dati da un metodo ad un altro. Tipicamente rappresentano dati che formano gruppi “naturali”, come una mano di poker (una collection di carte), un mail folder (a collection di e-mail), o un elenco telefonico (una collection di mappe nomenumero). Collections Famework 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. Core Collections Interfaces Occorre importare java.util.* Core Collections Interfaces A Collection represents a group of objects, known as its elements. Some Collection implementations allow duplicate elements and others do not. Some are ordered and others unordered. Core Collections Interfaces A Set is a collection that cannot contain duplicate elements Core Collections Interfaces A List is an ordered collection (sometimes called a sequence). Lists can contain duplicate elements. The user of a List generally has precise control over where in the List each element is inserted. The user can access elements by their integer index (position). Core Collections Interfaces A Map is an object that maps keys to values. Maps cannot contain duplicate keys: Each key can map to at most one value. Core Collections Interfaces Implementations Hash Table Set Interfaces HashSet List Map Resizable Array Balanced Tree TreeSet ArrayList HashMap Linked List LinkedList TreeMap Collection: Basic operations int size(); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); boolean remove(Object element); Iterator iterator(); Collection: basic operations The add method is defined generally enough so that it makes sense for collections that allow duplicates as well as those that don't. It guarantees that the Collection will contain the specified element after the call completes, and returns true if the Collection changes as a result of the call. The remove method is defined to remove a single instance of the specified element from the Collection, assuming the Collection contains the element, and to return true if the Collection was modified as a result. The Iterator interface public interface Iterator { boolean hasNext(); Object next(); void remove(); } hasNext returns true if there are more elements in the Collection next() returns the next element in the Collection remove() method removes from the underlying Collection the last element that was returned by next. The remove method may be called only once per call to next, and throws an exception if this condition is violated. Using Iterators void filter(Collection x) { Iterator i=x.iterator(); while (i.hasNext()) { if (!cond(i.next())) i.remove(); } cond(Object o) è un NOSTRO metodo nel quale noi implementiamo il controllo della condizione che decide se tenere o meno l’elemento } The code is polymorphic: it works for any Collection that supports element removal, regardless of implementation. That's how easy it is to write a polymorphic algorithm under the collections framework! Collection: bulk operations // Bulk operations boolean containsAll(Collection c); boolean addAll(Collection c); boolean removeAll(Collection c); boolean retainAll(Collection c); void clear(); // Array Operations Object[] toArray(); Object[] toArray(Object a[]); Collection: bulk operations addAll: Adds all of the elements in the specified Collection to the target Collection. removeAll: Removes from the target Collection all of its elements that are also contained in the specified Collection. retainAll: Removes from the target Collection all of its elements that are not also contained in the specified Collection. That is to say, it retains only those elements in the target Collection that are also contained in the specified Collection. The addAll, removeAll, and retainAll methods all return true if the target Collection was modified in the process of executing the operation. containsAll: Returns true if the target Collection contains all of the elements in the specified Collection (c). clear: Removes all elements from the Collection. Collection: Array operations Object[] toArray(); Object[] toArray(Object a[]); Perché Object[]? Ricordate il Principio di sostituzione Di Liskov! Dump the contents of The Collection c into a newly allocated array of Object whose length is identical to the number of elements in c: Object[] a = c.toArray(); Suppose c is known to contain only strings. Dump the contents of c into a newly allocated array of String whose length is identical to the number of elements in String[] a = (String[]) c.toArray(new String[0]); Notate il cast! Set: Interface 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. It adds the restriction that duplicate elements are prohibited. Set: bulk operations The bulk operations are particularly well suited to Sets: they perform standard set-algebraic operations. Suppose s1 and s2 are Sets. s1.containsAll(s2): Returns true if s2 is a subset of s1. s1.addAll(s2): Transforms s1 into the union of s1 and s2. s1.retainAll(s2): Transforms s1 into the intersection of s1 and s2. s1.removeAll(s2): Transforms s1 into the (asymmetric) set difference of s1 and s2. (the set difference of s1 - s2 is the set containing all the elements found in s1 but not in s2.) Nota: i metodi sono gli stessi di Collection Ma la semantica è ridefinita! 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. NOTA: aggiunge metodi addizionali a Collection! List: Interface // Positional Access Object get(int index); Object set(int index, Object element); void add(int index, Object element); Object remove(int index); boolean addAll(int index, Collection c); // Search int indexOf(Object o); int lastIndexOf(Object o); List: Interface // Iteration ListIterator listIterator(); ListIterator listIterator(int index); // Range-view List subList(int from, int to); Collections Collections è una classe che contiene metodi di utilità e costanti di servizio, tra cui sort(List): Sorts a List using a merge sort algorithm, which provides a fast, stable sort. (A stable sort is one that does not reorder equal elements.) shuffle(List): Randomly permutes the elements in a List. reverse(List): Reverses the order of the elements in a List. fill(List, Object): Overwrites every element in a List with the specified value. copy(List dest, List src): Copies the source List into the destination List. binarySearch(List, Object): Searches for an element in an ordered List using the binary search algorithm. List cardDeck=new ArrayList(); … Collections.shuffle(cardDeck); Empty Collections The Collections class provides three constants, representing the empty Set, the empty List, and the empty Map Collections.EMPTY_SET Collections.EMPTY_LIST Collections.EMPTY_MAP The main use of these constants is as input to methods that take a Collection of values, when you don't want to provide any values at all. Object ordering There are two ways to order objects: The Comparable interface provides automatic natural order on classes that implement it. The Comparator interface gives the programmer complete control over object ordering. These are not core collection interfaces, but underlying infrastructure. Object ordering with Comparable A List l may be sorted as follows: Collections.sort(l); If the list consists of String elements, it will be sorted into lexicographic (alphabetical) order. If it consists of Date elements, it will be sorted into chronological order. How does Java know how to do this? String and Date both implement the Comparable interface. The Comparable interfaces provides a natural ordering for a class, which allows objects of that class to be sorted automatically. Comparable Interface int compareTo(Comparable 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. Definisce l’”ordinamento naturale” per la classe implementante. Comparable Interface Class Point implements Comparable { int x; int y; .... int compareTo(Point p) { // ordino sulle y retval=y-p.y; // a partità di y ordino sulle x if (retval==0) retval=x-p.x; return retval; } p1 p2 p1 <p2 p1 p2 p1 <p2 Comparator Interface int compare(T o1, T o2) Compares its two arguments for order. class NamedPointComparatorByXY implements Comparator { int compare (NamedPoint p1, NamedPoint p2) { // ordino sulle y retval=p1.y-p2.y; // a partità di y ordino sulle x if (retval==0) retval=p1.x-p2.x; return retval; } Comparator Interface class NamedPointComparatorByName implements Comparator { int compare (NamedPoint p1, NamedPoint p2) { //usa l’ordine lessicografico delle stringhe return (p1.getName().compareTo(p2.getName())); } } Comparator Interface ... In un metodo di un altra classe: // sia c una Collection di NamedPoints boolean condition=…; Comparator cmp= null; if (condition) cmp= new NamedPointComparatorByName(); else cmp= new NamedPointComparatorByXY(); List x = new ArrayList(c); Collections.sort(x,cmp); Ordina la collezione usando il comparatore scelto import java.util.*; class EmpComparator implements Comparator { public int compare(Object o1, Object o2) { EmployeeRecord r1 = (EmployeeRecord) o1; EmployeeRecord r2 = (EmployeeRecord) o2; return r2.hireDate().compareTo(r1.hireDate()); }} class EmpSort { EmpSort() { Collection employees = ... ; // Employee Database List emp = new ArrayList(employees); Collections.sort(emp, new EmpComparator()); System.out.println(emp); } public static void main(String args[ ]) {new EmpSort();} } Lettura di int