Dato il codice per una lista semplicemente linkata (con le classi per la lista e per i nodi che puntano ad oggetti qualunque), con la lista che conta gli elementi contenuti:
Si scriva il codice di un metodo che produca la eliminazione di tutti i nodi della lista che puntano ad elementi uguali ad un elemento passato come parametro: è possibile che, se più nodi puntano ad elementi dello stesso valore, il metodo elimini molti nodi della lista.
Si consideri la relazione di uguaglianza opportuna (equals e non ==) per verificare la condizione di estrazione.
Il metodo abbia la interfaccia:
public
void removeItems(Object o)
public void
removeItems(Object o)
{if (first
== null) return;
if (first. getItem(). equals (o))
{first = first. getNext (); size--; return;}
ListNode nodo = first; ListNode prima
= null;
while (nodo.getNext() != null)
{
if (nodo. getItem ().equals(o) )
{prima. setNext(nodo. getNext()); size--; }
prima = nodo; nodo = nodo. getNext();
}
}
Si noti che
la lista deve esere scorsa tutta: per ogni elemento trovato uguale come
oggetto puntato al parametro (la uguaglianza è data con il metodo
equals), si deve togliere il nodo trovato. Si vede che si sono usati due
puntatori, uno all'elemento da eliminare (nodo)
e l'altro al precedente (prima).
Poi si continua
a scorrere la lista.
Sono distinti
il caso di primo elemento e di lista vuota (non considerato eccezione).
Filtri
Scrivere un filtro che prenda l'ingresso da System.in e ponga la propria uscita oltre a System.out su un file di uscita fornito come argomento di invocazione (si controlli che la invocazione avvenga con il numero corretto di argomenti).
Il filtro deve filtrare il file di ingresso considerando che si vogliono trasformare i caratteri maiuscoli in minuscoli nel file di uscita.
Si noti che il file di ingresso può essere costituito da un numero qualunque di linee, fino alla fine del file.
Ad esempio, il filtro, invocato con argomento fileout.txt, deve trasformare i caratteri forniti da console:
"Esame di Fondamenti di Informatica A II *()&(" in
"esame di fondamenti di informatica a ii *()&("
Il risultato dell'elaborazione deve essere scritto sia su System.out che su fileout.txt.
package filtro;
import java.io.*;
public class Filtro {
public static
void main(String[] args) {
int totale=0;
if
(args.length != 1) {
System.out.println("Problemi di argomenti\n sono" + args.length);
System.exit(1);
}
FileWriter
file = null;
try
{
file = new FileWriter (args[0]);
}
catch
(IOException e) {
System.out.println("Errore. Problema nella apertura file.");
System.exit(2);
}
filtra
(file);
System.exit(0);
}
public static
void filtra(FileWriter file) {
InputStreamReader
in = new InputStreamReader(System.in);
OutputStreamWriter
out = new OutputStreamWriter(System.out);
int
x; boolean statoMaiuscolo = false;
try
{
while ((x = in.read()) >= 0) {
char ch = (char) x;
if (ch == '\n') {out.flush();}
// notate che
si esamina un carattere alla volta
// e non si leggono
linee o l'intero file
if (ch >= 'A' && ch <= 'Z') ch += - 'A' + 'a';
// solo i caratteri
maiuscoli sono cambiati
// tutti gli altri
inalterati
out.write(ch); file.write (ch);
}
}
catch
(IOException e) {
System.out.println("Errore. Problema nella scrittura ");
System.exit(3);
}
try
{ out.close(); file.close ();}
catch
(IOException e) {
System.out.println("Errore. Problema in chiusura");
System.exit(4);
}
}
}
Componenti grafici
Dato il seguente codice:
public class Esame1 {
public static void main(String args[]) {
}JButton b1 = new JButton("Bottone 1");
JButton b2 = new JButton("Bottone 2");
JButton b2 = new JButton("Bottone 3");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Bottoni al momento: PARI");
frame.setBounds(200, 100, 208, 180);
frame.setResizable(false);
Container c = frame.getContentPane();
c.add(panel);
…
frame.show();
}
Si consideri un componente che deve gestire tre bottoni. I bottoni sono associati ad uno stato interno che tiene traccia del numero delle pressioni, discriminando i valori pari e dispari.
Obiettivo del componente grafico è segnalare lo stato dei bottoni: in particolare, sono di interesse le situazioni in cui tutti i bottoni hanno ricevuto un numero pari o dispari di pressioni. Inizialmente, il numero di pressioni per tutti i bottoni è pari; questa situazione, di tutti i bottoni pari, viene segnalata nel (titolo del) frame. Per ogni pressione di un bottone, si deve considerare la variazione del numero di pressioni.
Quando i bottoni si trovano tutti nello stesso stato (o tutti pari o tutti dispari) si deve cambiare il titolo del frame corrispondentemente. Se i bottoni non sono concordi, il titolo del frame deve segnalarlo ("Bottoni NON concordi").
Inoltre, facoltativamente,
si consideri la possibilità di fornire una visualizzazione del numero
di pressioni per ciascun bottone.
package esame2;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Esame2 {
public static void main(String
args[]) {
JButton b1 =
new JButton("Bottone 1"); JTextField t1 = new JTextField("0", 5);
JButton b2 =
new JButton("Bottone 2"); JTextField t2 = new JTextField("0", 5);
JButton b3 =
new JButton("Bottone 3"); JTextField t3 = new JTextField("0", 5);
JPanel panel = new JPanel();
EsameFrame
frame= new EsameFrame("Bottoni concordi: al momento PARI",
b1, b2, b3, t1, t2, t3);
Container
c = frame.getContentPane();
c.add(panel);
panel.add(b1);
panel.add(t1);
panel.add(b2);
panel.add(t2);
panel.add(b3);
panel.add(t3);
b1.addActionListener
(frame);
b2.addActionListener
(frame);
b3.addActionListener
(frame);
frame.addWindowListener(new
Terminator ());
frame.show();
}
}
class EsameFrame extends
JFrame implements ActionListener {
private int s1
= 0, s2 = 0, s3 = 0, somma;
private JTextField
t1, t2, t3;
private JButton
b1, b2, b3;
public EsameFrame
(String t, JButton b1, JButton b2, JButton b3,
JTextField
t1, JTextField t2, JTextField t3) {
super(t);
setBounds(200,
100, 400, 300);
// this.setResizable(false);
this. t1 = t1;
this. t2 = t2; this. t3 = t3;
this. b1 = b1;
this. b2 = b2; this. b3 = b3;
}
public void actionPerformed(ActionEvent
e){
if
(e.getSource() == b1)
{
System.out.println (" Bottone 1\n");
s1 ++;
t1.setText ("Vale" + s1);
}
if
(e.getSource() == b2)
{
System.out.println (" Bottone 2\n");
s2 ++;
t2.setText ("Vale" + s2);
}
if
(e.getSource() == b3)
{
System.out.println (" Bottone 3\n");
s3 ++;
t3.setText ("Vale" + s3);
}
System.out.println
(" Bottoni " + s1 + " " + s2 + " " + s3 + "\n");
if
(s1%2 == 0 && s2%2 == 0 && s3%2 ==0)
setTitle("Bottoni concordi: al momento PARI");
else
if (s1%2 == 1 && s2%2 == 1 && s3%2 == 1)
setTitle("Bottoni concordi: al momento DISPARI");
else
setTitle("Bottoni NON concordi");
}
}
//----------------------------
class Terminator implements
WindowListener {
public void windowClosed(WindowEvent
e){}
public void windowClosing(WindowEvent
e){ System.exit(0); }
public void windowOpened(WindowEvent
e){}
public void windowIconified(WindowEvent
e){}
public void windowDeiconified(WindowEvent
e){}
public void windowActivated(WindowEvent
e){}
public void windowDeactivated(WindowEvent
e){}
}
Si considerino anche soluzioni alternative per la visualizzazione di un intero come stringa (o di un reale, ecc).