Esercizio 3
Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti della specifica. Realizzare la procedura stand-alone che, data una QueueWithPriority, la modifica rimuovendo tutti gli elementi con priorità massima.
Specifica
Implementazione Rappresentazione: usiamo un Vector per implementare la coda con priorità, ogni elemento è una coppia consistente di una stringa e di un intero (tipo record). Il primo elemento della coda è il primo elemento del vettore. Implementiamo i metodi di conseguenza
Utilizziamo il tipo Pair cosí definito: Public class Pair { // OVERVIEW: un tipo record private String value; private int prior; // costruttore Pair (String s, int n) // EFFECTS: inizializza il “record” // con i valori di s ed n {value = s; prior = n;} // metodi public String left(){ // EFFECTS: restituisce this.value return value;} public int right(){ // EFFECTS: restituisce this.prior return prior;} }
public class QueuewithPriority { // OVERVIEW: una QueueWithPriority è una coda con priorità, ossia una // collezione di oggetti (di tipo String) a cui è associata una priorità (un // numero). Gli elementi sono ordinati in modo decrescente in base alla // priorità e a parità di priorità in base all’ordine di inserimento // (con una politica first in first out). E` modificabile. private Vector els; \\ rappresentazione privata
public QueuewithPriority () { \\ EFFECTS: costruisce una QueuewithPriority vuota els = new Vector();} public String first() throws EmptyException { \\ EFFECTS: se this è vuoto solleva EmptyException, altrimenti \\ restituisce il primo elemento di this if (els.size()==0) {throw new EmptyException(“vuota”);}; Pair p = (Pair) els.get(0); return p.left();}
public int max() throws EmptyException { \\ EFFECTS: se this è vuoto solleva EmptyException, altrimenti \\ restituisce la priorità massima presente in this if (els.size()==0) {throw new EmptyException(“vuota”);}; Pair p = (Pair) els.get(0); return p.right();} public void dequeue() throws EmptyException { \\ MODIFIES: this \\ EFFECTS: se this è vuoto solleva EmptyException, altrimenti \\ rimuove il primo elemento di this if (els.size()==0) {throw new EmptyException(“coda vuota”);}; els.remove(0);}
public void enqueue(String x, int p) ) throws NullPointerException { \\ MODIFIES: this \\ EFFECTS: se x è null solleva NullPointerException, altrimenti \\ inserisce x in this con priorità p if (x == null) {throw new NullPointerException(“null”);}; Pair z = new Pair (x,p); els.add(z); if (els.size() <= 1) {return;}; int i = els.size()-2; while (i >=0) { Pair q =(Pair) els.get(i); if (q.right() >= z.right()) {return;}; els.set(i+1,q); els.set(i,z); i--;}
Procedura stand-alone Scritta vedendo solo la specifica di QueuewithPriority (non vediamo la rappresentazione, ovvero la variabile d’istanza els di tipo Vector) public static void removemax(QueuewithPriority p)) { \\ MODIFIES: p \\ EFFECTS: rimuove da p tutti gli elementi di priorità pari alla massima if (p == null) {return;}; int i; try{i = p.max()} catch(EmptyException) {return;} p.dequeue(); try{ while (p.max() == i) {p.dequeue();}} catch (EmptyException) {return;} }