/***************************** FILE: ElettroDom.java *****************************/
public class ElettroDom {
public static class Dimensione {
public final int altezza;
public final int larghezza;
public final int profondita;
public Dimensione(int a, int l, int p) {
altezza = a;
larghezza = l;
profondita = p;
}
public void stampa() {
System.out.println("Altezza: " + altezza + " Larghezza: " + larghezza + " Profondità:" + profondita);
}
}
public final String marca;
public final String modello;
private float prezzo;
private Dimensione dimensione;
public ElettroDom(String m, String mod) {
marca = m;
modello = mod;
}
public void setPrezzo(float p) { prezzo = p; }
public void setDimensione(Dimensione d) { dimensione = d; }
public float getPrezzo() { return prezzo; }
public Dimensione getDimensione() { return dimensione; }
public void stampa() {
System.out.println("Marca: "+marca);
System.out.println("Modello: "+modello);
System.out.println("Prezzo: "+prezzo);
if (dimensione != null) dimensione.stampa();
}
}
/***************************** FILE: Frigo.java *****************************/
public class Frigo extends ElettroDom {
private int capacita;
public Frigo(String m, String mod) { super(m, mod); }
public void setCapacita(int c) { capacita = c; }
public int getCapacita() { return capacita; }
//Ridefinsce il metodo della superclasse
public void stampa() {
super.stampa();
System.out.println("Capacità: "+capacita);
}
}
/***************************** FILE: Lavatrice.java *****************************/
import java.util.Arrays;
public class Lavatrice extends ElettroDom {
private String[] programmi;
public Lavatrice(String m, String mod) {
super(m, mod);
programmi = new String[0];
}
public boolean addProg(String prog) {
if (prog == null) return false;
int n = programmi.length;
for (int i = 0 ; i < n ; i++)
if (programmi[i].equals(prog)) return false;
programmi = Arrays.copyOf(programmi, n + 1);
programmi[n] = prog;
return true;
}
public String[] getProg() {
return Arrays.copyOf(programmi, programmi.length);
}
//Ridefinsce il metodo della superclasse
public void stampa() {
super.stampa();
System.out.println("Programmi: ");
for (int i = 0 ; i < programmi.length ; i++)
System.out.println(" "+programmi[i]);
}
}
cercaLavatrice() della classe ElettroDom.
public static Lavatrice[] cercaLavatrice(ElettroDom[] arr, String prog) {
Lavatrice[] lavArray = new Lavatrice[0];
for (int i = 0 ; i < arr.length ; i++) {
if (arr[i] instanceof Lavatrice) {
Lavatrice lav = (Lavatrice)arr[i];
String[] p = lav.getProg();
for (int j = 0 ; j < p.length ; j++) {
if (p[j].equals(prog)) {
int n = lavArray.length;
lavArray = Arrays.copyOf(lavArray, n + 1);
lavArray[n] = lav;
break;
}
}
}
}
return lavArray;
}
DoubleLine la linea line = l; provoca un errore
in compilazione perché dovrebbe essere sostituita da super(l);.
print() nella classe DoubleLine è
un metodo ricorsivo che se eseguito porta ad un loop infinito. L'invocazione ricorsiva dovrebbe
essere sostituita dall'invocazione del metodo della superclasse super.print().
linee[0] = new Line("prima"); provoca un errore in esecuzione (ArrayStoreException)
perché l'array il cui riferimento è nella variabile linee è un array di DoubleLine
e quest'ultimo tipo non è un supertipo di Line.
linee[2].print(); provoca un errore in esecuzione (NullPointerException)
perché line[2] ha valore null e si tenta quindi di invocare il metodo
print() su un riferimento inesistente.
PrefixFree con il metodo add.
public class PrefixFree {
private String[] set;
public PrefixFree() {
set = new String[0];
}
//Metodo ausiliario che ritorna true se s1 è un prefisso di s2
private static boolean isPrefix(String s1, String s2) {
if (s1.length() > s2.length()) return false;
for (int i = 0 ; i < s1.length() ; i++)
if (s1.charAt(i) != s2.charAt(i)) return false;
return true;
}
public boolean add(String s) {
int n = set.length; //Controlla se la stringa s è in relazione
for (int i = 0 ; i < n ; i++) //di prefisso con qualche stringa dell'insieme.
if (isPrefix(set[i], s) || isPrefix(s, set[i]))
return false;
set = Arrays.copyOf(set, n + 1); //Estende l'array per contenere anche s
set[n] = s;
return true;
}
}
extensions() della classe PrefixFree:
public String[] extensions(String p) {
int ne = 0; //Conta il numero di stringhe nell'insieme
for (int i = 0 ; i < set.length ; i++) //tali che p è un loro prefisso.
if (isPrefix(p, set[i])) ne++;
String[] ext = new String[ne]; //Crea un array per contenere tali stringhe
int j = 0;
for (int i = 0 ; i < set.length ; i++) //Aggiungi le stringhe nell'array
if (isPrefix(p, set[i]))
ext[j++] = set[i];
return ext;
}
main della classe PrefixFree.
import java.io.*;
import java.util.*;
public static void main(String[] args) throws FileNotFoundException {
String inpath = args[0];
String outpath = args[1];
String p = args[2];
File infile = new File(inpath);
Scanner in = new Scanner(infile); //Apri il file di input in lettura
PrefixFree set = new PrefixFree(); //Crea un insieme prefix free vuoto
while (in.hasNextLine()) //Aggiungi le linee del file all'insieme
if (!set.add(in.nextLine())) { //Se non sono un insieme prefix free
System.out.println("Non è prefix free"); //termina il programma.
return;
}
File outfile = new File(outpath);
PrintStream out = new PrintStream(outfile); //Apri il file di output in scrittura
String[] ext = set.extensions(p); //Ottieni le estensioni della stringa p
for (int i = 0 ; i < ext.length ; i++) //Scrivi le estensioni nel file
out.println(ext[i]);
}