Filtraggio dati da file


Obiettivi


Descrizione

Utilizzando le API standard Java, in particolare le classi Scanner (introdotta con la versione JDK 1.5) e PrintWriter per leggere e scrivere file di testo, e la classe StringTokenizer per estrarre valori numerici da una stringa, realizzare un programma che accetta come parametri da linea di comando due stringhe, che rappresentano nomi di files. I file indicati a linea di comando devono essere file di testo presenti nella cartella in cui si trova la classe eseguita, secondo il formato di seguito specificato.

FILE 1

Rappresenta un insieme di giocate al gioco del lotto. Ciascuna giocata contiene da 1 a 10 numeri.

Il file contiene una sequenza di linee, in cui ciascuna linea contiene da 1 a 10 numeri interi distinti. Ciascuna linea ha quindi il seguente formato:

x1;x2;x3;...;xk;

dove ciascun xi e' un numero intero nell'intervallo [1, 90], e k può essere diverso per ciascuna linea, con valori tra 1 e 10.

FILE 2

Rappresenta una estrazione del lotto. Il file contiene una sola linea, contenente una sequenza di 5 interi distinti nell'intervallo [1, 90]:

e1;e2;e3;e4;e5;

RISULTATO

Il programma deve produrre un file che riporta solo le giocate che hanno indovinato almeno un numero tra quelli estratti. Il risultato deve essere scritto, sempre sotto forma di file di testo, in un file che ha lo stesso nome del FILE 1, seguito dal suffisso "esito.txt".

Questo file conterrà solo le linee del FILE 1 per le quali l'intersezione con il contenuto del FILE 2 è diverso dall'insieme vuoto. In particolare il file risultato, in corrispondenza di ciascuna linea vincente

x1;x2;x3;...;xk;

del FILE 1, conterrà una linea del tipo:

CATEGORIA z: x1;x2;x3;...;xk;

in cui z rappresenta il numero di estratti indovinati, cioè la dimensione dell'intersezione tra la corrispondente riga del FILE 1 e i valori estratti (l'unica riga del FILE 2).


Suggerimenti

Il programma utilizza due oggetti di classe Scanner: uno legge FILE 1 e l'altro legge FILE 2. Il contenuto di FILE 2 può essere letto una sola volta e memorizzato nel programma in forma opportuna, e poi utilizzato per confrontarlo con ciascuna giocata.

Contemporaneamente viene utilizzato un oggetto di classe PrintWriter per scrivere il file risultato.

Un ciclo esamina una riga alla volta di FILE 1, per decidere se si tratta di una giocata vincente ed eventualmente riportarla nel file risultato. La decisione viene presa richiamando un metodo che valuta la misura della intersezione tra una giocata e l'estrazione.

In prima approssimazione si può definire il metodo che valuta la vincita in maniera fittizia, ad esempio restituisce 1 se il primo numero della giocata è maggiore di 45 e restituisce 0 altrimenti. Questo permette di mettere a punto il ciclo che legge l'input e scrive il risultato. In seguito si provvederà a mettere a punto il criterio corretto di valutazione della vincita.

Per determinare rapidamente la misura della intersezione può essere utile ordinare sia la giocata che l'estrazione in modo crescente, e procedere poi con una scansione simile a quanto fatto nella procedura merge dell'algoritmo merge sort, oppure procedere un maniera più semplice con una coppia di cicli nidificati.