java pila/coda polimorfa. la pila in java - 1 package strutture; public abstract class stack {...

25
Java Pila/coda polimorfa

Upload: megan-mccann

Post on 26-Mar-2015

232 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Java

Pila/coda polimorfa

Page 2: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java - 1package strutture;public abstract class Stack { protected int size; protected int defaultGrowthSize=5; protected int marker; protected Object contenuto[]; protected final int initialSize=3;

public Stack() { size=initialSize; marker=0; contenuto=new Object[size]; }

Page 3: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java - 2

public final void inserisci(Object k) { if (marker==size)

{cresci(defaultGrowthSize);} contenuto[marker]=k; marker++; }

public abstract Object estrai() ;

Abilita lostatic

binding

Page 4: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java - 3

private void cresci(int dim){ Object temp[ ]=new Object[size]; for (int k=0;k<size;k++) temp[k]=contenuto[k]; contenuto=new Object[size+defaultGrowthSize]; for (int k=0;k<size;k++)

contenuto[k]=temp[k]; size+=defaultGrowthSize;}

Page 5: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java - 4

package strutture;public class Pila extends Stack {

public Object estrai() { assert(marker>0):"Estrazione da Pila vuota";

return contenuto[--marker]; }}

Page 6: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Coda in Java - 5

package strutture;public class Coda extends Stack {

Object estrai() { assert(marker>0):"Estrazione da Coda vuota"; Object retval=contenuto[0]; for (int k=1; k<marker; k++ ) contenuto[k-1]=contenuto[k]; marker--; return retval; }}

Page 7: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java – 6apublic static void main(String args[]) { int dim=10; Stack s=new Pila(); // s= new Coda(); for (int k=0;k<dim;k++){ Integer o=new Integer(k); s.inserisci(o); } for (int k=0;k<3*dim;k++) { Integer i = s.estrai(); int w=i.intValue(); System.out.println(w); }}

Page 8: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java – 6bpublic static void main(String args[]) { int dim=10; Pila s=new Pila(); for (int k=0;k<dim;k++){ Integer o=new Integer(k); s.inserisci(o); } for (int k=0;k<3*dim;k++) { Integer i = s.estrai(); int w=i.intValue(); System.out.println(w); }}

ERRORE!Non posso mettere un Object in un

Integer!

Page 9: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java – 6cpublic static void main(String args[]) { int dim=10; Pila s=new Pila(); for (int k=0;k<dim;k++){ Integer o=new Integer(k); s.inserisci(o); } for (int k=0;k<3*dim;k++) { Integer i = (Integer)s.estrai(); int w=i.intValue(); System.out.println(w); }}

Page 10: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java – 7a

public static void main(String args[]) { int dim=10; Pila s=new Pila(); //INSERIMENTO for (int k=0;k<dim;k++){ Object o; if (Math.random()<0.5) o=new Integer(k); else o=new Float(k*Math.PI); s.inserisci(o); }

Page 11: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java – 7b // ESTRAZIONE for (int k=0;k<dim;k++) { Object o = s.estrai(); if (o instanceof Integer) { Integer i = (Integer) o; int w = i.intValue(); System.out.println("an int:"+w); } else if (o instanceof Float) { Float i = (Float) o; float w = i.floatValue(); System.out.println("a float:"+w); } else System.out.println("Unknown class!"); } }

Page 12: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

La Pila in Java – 7c

OUTPUT:

a float:28.274334an int:8an int:7a float:18.849556an int:5an int:4a float:9.424778a float:6.2831855a float:3.1415927a float:0.0

Page 13: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Java

Generics

Page 14: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

DefinizioneA generic type is a reference type that has one or more type parameters. In the definition of the generic type, the type parameter section follows the type name. It is a comma separated list of identifiers and is delimited by angle brackets. 

class Pair<X,Y>  {    private X first;   private Y second;   public Pair(X a1, Y a2) {     first  = a1;     second = a2;   }   public X getFirst()  { return first; }   public Y getSecond() { return second; }   public void setFirst(X arg)  { first = arg; }   public void setSecond(Y arg) { second = arg; } }

Page 15: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Definizione - continuaThe class Pair has two type parameters X and Y . 

They are replaced by type arguments when the generic type Pair is instantiated.

For instance, in the declaration Pair<String, Date> the type parameter X is replaced by the type argument String and Y is replaced by  Date . 

The scope of the identifiers X and Y is the entire definition of the class.  In this scope the two type parameters X and Y are used like they were types (with some restrictions).

Page 16: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Esempio public void printPair( Pair<String,Long> pair) { System.out.println("("+pair.getFirst()+",“

+pair.getSecond()+")"); }

Pair<String,Long> limit = new Pair<String,Long> ("maximum",1024L);

printPair(limit);

Page 17: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Wildcard instantiation public void printPair( Pair<?,?> pair) { System.out.println("("+pair.getFirst()+",“

+pair.getSecond()+")"); }

Pair<?,?> limit = new Pair<String,Long> ("maximum",1024L);

printPair(limit);

Page 18: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Generics are not usable…

for creation of arrays in an instanceof expression

Page 19: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Referenze su generics:

Il meglio:

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

Page 20: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Uso di Generics nelle API di JavaHere is a simple example taken from the existing Collections tutorial: // Removes 4-letter words from c. Elements must be strings

static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) if (((String) i.next()).length() == 4) i.remove(); }

Here is the same example modified to use generics: // Removes the 4-letter words from c static void expurgate(Collection<String> c) { for (Iterator<String> i = c.iterator(); i.hasNext(); ) if (i.next().length() == 4) i.remove(); }

In Java 5molte classisono state

riscritteusando igenerics

Page 21: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Generic Pilapublic class Pila <T> { … public Pila () {… } private void cresci(int dim) {…}

public final void inserisci(T k) { if (marker == size) { cresci(defaultGrowthSize); } contenuto[marker] = k; marker++; }

public T estrai() { assert(marker > 0):"Estrazione da Pila vuota"; return (T) contenuto[--marker]; }

Page 22: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Generic Pila - compilazione

javac Pila.java –source 1.5

Page 23: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Generic Pila

public static void main(String args[]) { int dim = 10; Pila<Integer> s = new Pila<Integer>(); for (int k = 0; k < dim; k++) { s.inserisci(new Integer(k)); } for (int k = 0; k < 3 * dim; k++) { Integer w = s.estrai();

// Integer w = (Integer) s.estrai(); System.out.println(w); } }

}

Page 24: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Generic Pilapublic class Pila <T> { … public Pila () {… } private void cresci(int dim) {…}

public final void inserisci(T k) { if (marker == size) { cresci(defaultGrowthSize); } contenuto[marker] = k; marker++; }

public T estrai() { assert(marker > 0):"Estrazione da Pila vuota"; return (T) contenuto[--marker]; }

Note: Pila.java uses unchecked or unsafe operations.

Page 25: Java Pila/coda polimorfa. La Pila in Java - 1 package strutture; public abstract class Stack { protected int size; protected int defaultGrowthSize=5;

Generic Pilapublic static void main(String args[]) { int dim = 10; Pila<Integer> s = new Pila<Integer>(); for (int k = 0; k < dim; k++) { s.inserisci(new String("pippo"))); } for (int k = 0; k < 3 * dim; k++) { Integer w = s.estrai();

// Integer w = (Integer) s.estrai(); System.out.println(w); } }}

Pila.java:43: inserisci(java.lang.Integer) in Pila<java.lang.Integer> cannot be applied to (java.lang.String) s.inserisci(new String("pippo")); ^