/***************************** 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]); }