PDA

View Full Version : [Java] Struttura per I/O rudimentale


Andrea16v
01-08-2006, 09:33
Ciao a tutti, devo realizzare un piccolo database di giocatori di Calcio (anche se non amo particolarmente questo sport)

Per ogni calciatore devo memorizzare in un file di testo con input da tastiera una serie di dati (Nome_Cognome, ruolo in campo, data di nascita, squadra di appartenenza, voto medio in campo ecc)

Da questo file di testo in cui memorizzo i dati devo poter aggiungere ulteriori calciatori in istanti successivi e poter estrarre tutte le informazioni relative a un calciatore inserendo il suo Nome_Cognome.

Che strutture mi conviene usare per semplificare al massimo il tutto?

Angus
01-08-2006, 12:34
Ciao a tutti, devo realizzare un piccolo database di giocatori di Calcio (anche se non amo particolarmente questo sport)

Per ogni calciatore devo memorizzare in un file di testo con input da tastiera una serie di dati (Nome_Cognome, ruolo in campo, data di nascita, squadra di appartenenza, voto medio in campo ecc)

Da questo file di testo in cui memorizzo i dati devo poter aggiungere ulteriori calciatori in istanti successivi e poter estrarre tutte le informazioni relative a un calciatore inserendo il suo Nome_Cognome.

Che strutture mi conviene usare per semplificare al massimo il tutto?

XML per memorizzare i dati ed XPATH per estrarli.

Andrea16v
01-08-2006, 12:51
XML per memorizzare i dati ed XPATH per estrarli.

Intendevo proprio come struttura dei dati sul file di testo.
Devo usare solo costrutti "semplici" quali array, vettori, liste, code, al limite posso aiutarmi con una classe già esistente ma sarebbe meglio di no.
Il file di testo prodotto non serve che sia direttamente consultabile e i dati una volta inseriti non necessitano di modifiche e cancellazioni, solo di ricerche in lettura tramite stampa di righe di testo (per esempio per sapere i migliori di ogni squadra) ed eventualmente ulteriori inserimenti di calciatori in momenti successivi.

Angus
01-08-2006, 13:10
Intendevo proprio come struttura dei dati sul file di testo.
Devo usare solo costrutti "semplici" quali array, vettori, liste, code, al limite posso aiutarmi con una classe già esistente ma sarebbe meglio di no.
Il file di testo prodotto non serve che sia direttamente consultabile e i dati una volta inseriti non necessitano di modifiche e cancellazioni, solo di ricerche in lettura tramite stampa di righe di testo (per esempio per sapere i migliori di ogni squadra) ed eventualmente ulteriori inserimenti di calciatori in momenti successivi.

Evito di dire quello che penso di chi impone esercizi sulle strutture dati e gli algoritmi di ricerca da fare in Java *senza* utilizzarne il framework... :muro:

Visto che il tuo intento è *semplificare*, hai già pensato a scrivere per ogni giocatore una riga (comma separated o fixed length) nel file? Quando devi effettuare un inserimento appendi una riga al file, quando devi effettuare una lettura scorri tutte le righe del file finchè non trovi quella/e che ti interessano e le trasformi in oggetti che poi inserisci al volo in strutture dati più utili.

cionci
01-08-2006, 14:27
Concordo con Angus... Se la traccia ti mette queste limitazioni allora vai di campi separati da punto e virgola... Su ogni riga c'è un giocatore...

Per leggere e scrivere usa BufferedReader e BufferedWriter... Usa StringTokenizer, se ti è possibile, per separare i campi in lettura...

andbin
01-08-2006, 21:11
... e aggiungo (oltre a quanto già detto da Angus e cionci), ti crei una nuova classe (es. Calciatore) che "incapsula" tutti i dati del calciatore.

maurizio2
02-08-2006, 18:34
Puoi usare la serializzazione; definisci una classe con tutte le
proprieta' e i metodi accessor e mutator di tali proprieta'.
Poi puoi implementare dei metodi per la visualizzazione e la ricerca...
Cmq hai molti modi per definire un semplice database, quindi
prima bisogna capire cosa vuoi fare, se e' un esercizio allora
devi rispettare cosa esso ti chiede, se invece e' un tuo scrupolo
personale allora hai il mare intorno...
cioa :)

anx721
02-08-2006, 19:52
Esempio di formato:

---calciatore---
nome: mario rossi
ruolo: attaccante
squadra: roma
data_nascita: 123123123
numero_maglia: 10
ecc...
---calciatore---


Definisciti dei metodi del tipo:


String leggiStringa(BufferedInputStream s, String delimitatore)
int leggiIntero(BufferedInputStream s, String delimitatore)
Date leggiData(BufferedInputStream s, String delimitatore)
void leggiDelimitatore(BufferedInputStream s, String delimitatore)

dove ad esempio

leggiIntero(BufferedInputStream s, String delimitatore)

legge la prossima linea dallo stream, verifica che inizi con il delimitatore, quindi elimina il delimitatore dalla linea, elimina eventuali spazi iniziali e finali e interpreta quello che resta come un intero.

ad esempio se vuoi leggere la riga

numero_maglia: 10

invochi:

int n = leggiIntero(s, "numero_maglia:");

Con questi metodi puoi leggerti tutti i dati e interpretarli come vuoi, in modo parametrico rispetto al delimitatore.

Per leggere un calciatore:


private void Calciatore leggiCalciatore(BufferedInputStream s){
leggiDelimitatore(s, "---calciatore---");
String nome = leggiStringa(s, "nome:");
String ruolo = leggiStringa(s, "ruolo:");
int numero_maglia = leggiIntero(s, "numero_maglia");
//ecc...
Calciatore calciatore = new Calciatore(nome, ruolo, numero_maglia,...);
return calciatore;
}


leggiCalciatore dovrebbe ritornare null se non ci sono più calciatori da leggere nel file.

Ogni metodo dovrebbe lanciare un'eccezione se la riga non inizia con il delimitatore aspettato. All'avvio dell'applicazione l'intero "database" dovrebbe essere caricato in memoria.

La serializzazione è comoda e facile ma non va bene per due motivi:

1 - se hanno assegnato questo esercizio è perche uno deve far pratica con la lettura e scrittura degli stream di i/o quindi non è vero che non ha senso asegnare i progetti imponendo di non utilizzare classi avanzate, bisogna prima imparare l'abc...

2 - se cambia una classe con la serializzazione perdi tutti i dati perche gli oggetti serializzati non saranno più compatibili con la nuova classe e quindi il database diventa illegibile.

Angus
03-08-2006, 10:15
1 - se hanno assegnato questo esercizio è perche uno deve far pratica con la lettura e scrittura degli stream di i/o quindi non è vero che non ha senso asegnare i progetti imponendo di non utilizzare classi avanzate, bisogna prima imparare l'abc...


Per imparare l'ABC esistono linguaggi migliori di Java (che può confondere le idee se utilizzato in maniera 'procedurale'). Comunque mi riferivo allo studio delle strutture dati, non degli stream di I/O. La verità la stabilisco io :sofico:

anx721
03-08-2006, 20:33
Per imparare l'ABC esistono linguaggi migliori di Java (che può confondere le idee se utilizzato in maniera 'procedurale'). Comunque mi riferivo allo studio delle strutture dati, non degli stream di I/O. La verità la stabilisco io :sofico:

Java va benissimo per imparare, non a caso è utilizzato molto nelle universita. L'abc lo devi imparare comunque anche con java; chi ha sviluppato ad esempio le classi per lavorare con xml e quindi gestire dati a più alto livello deve comunque essersi studiato per bene il funzionamento degli stream.

Andrea16v
03-08-2006, 20:58
Esempio di formato:

---calciatore---
nome: mario rossi
ruolo: attaccante
squadra: roma
data_nascita: 123123123
numero_maglia: 10
ecc...
---calciatore---


Definisciti dei metodi del tipo: (..)


Mi piace anche questa soluzione, ora vedo di buttare giù un po' di codice... :)

Angus
04-08-2006, 09:41
Java va benissimo per imparare, non a caso è utilizzato molto nelle universita. L'abc lo devi imparare comunque anche con java; chi ha sviluppato ad esempio le classi per lavorare con xml e quindi gestire dati a più alto livello deve comunque essersi studiato per bene il funzionamento degli stream.

Ribadisco che non voglio soffermarmi sull'argomento, che è troppo soggettivo. So benissimo che Java è utilizzato nelle università: proprio da quell'esperienza traggo le mie conclusioni.
Da Java fan ritengo che esistano linguaggi migliori per imparare l'ABC (dell'approccio procedurale, non OO), che poi serve comunque per qualsiasi linguaggio. Sono invece d'accordo che è importante conoscere il framework di un linguaggio ad alto livello come Java, partendo dalle basi come l'I/O, ma non mi si dica che non posso usare una HashMap per effettuare le mie ricerche...


Ok, sto facendo la figura di quello che vuole avere per forza ragione. E' tutto IMHO.

Andrea16v
07-08-2006, 09:45
edited