Scrittura di un ArrayList su un file di testo

di il
14 risposte

Scrittura di un ArrayList su un file di testo

Ciao a tutti ragazzi, vi spiego il problema.
Ho creato una classe Carta (da gioco) abbastanza ristretta, sono 12 carte in totale.
Carico le carte da un file di testo, le stampo e le mescolo.
Adesso, dovrei scrivere il nuovo array "mazzomescolato" su un file di testo ed è qui che ho difficoltà.
Allego il codice

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class MescolatoreCarte {
	public static ArrayList <Carta> mazzo=new ArrayList<Carta>();
	public static String numero;
	public static String seme;

	//////////////////////////////////
	// metodo per la scrittura su file
	//////////////////////////////////
	public void scriviFile(ArrayList mazzomescolato) { 

		String path = "esercizio.txt",s; 
		try { 
			File file = new File(path); 
			FileWriter fw = new FileWriter(file); 

			for(int i=0; i<mazzomescolato.size(); i++) { 
				s = toString(); 

				fw.write(s); 
			} 

			fw.flush(); 

			fw.close(); 

		} catch (IOException e) { 

			System.err.println(e); 

		} 
	} 

	//////////////////////////////////

	public static void main(String[] args) {
		try{
			Scanner scan=new Scanner(new File("mazzocarte.txt"));
			while(scan.hasNext()){
				numero=scan.next();
				seme=scan.next();
				mazzo.add(new Carta(numero,seme));
			}
		}catch(IOException e){
			System.out.println("errore in lettura");
		}

		for (int i=0;i<mazzo.size();i++){
			System.out.println(mazzo.get(i).toString());
		}
		System.out.println("ADESSO MESCOLO LE CARTE");

		//mescolo il mazzo
		ArrayList <Carta>mazzomescolato=new ArrayList<Carta>();
		Collections.shuffle(mazzo);
		
		//metto in mazzomescolato la "mescolatura"
		for(int i=0;i<mazzo.size();i++){
			mazzomescolato.addAll(mazzo);
		}
		
		//stampo il mazzomescolato
		for (int i=0;i<mazzo.size();i++){
			System.out.println(mazzomescolato.get(i).toString());
		}		
	}
}


14 Risposte

  • Re: Scrittura di un ArrayList su un file di testo

    cicciozza ha scritto:


    			for(int i=0; i<mazzomescolato.size(); i++) { 
    				s = toString(); 
    
    				fw.write(s); 
    			} 
    No, il toString() così non è corretto. Questo infatti è il toString() dell'oggetto MescolatoreCarte (non della Carta i-esima)!

    E comunque campi public static .... NO!
  • Re: Scrittura di un ArrayList su un file di testo

    Questo metodo l'ho trovato cercando qua e la

    I campi li metto solo public?
    Con il fileWriter avevo fatto qualche esercizio di scrittura stringhe e sinceramente quella s = toString(); faceva strano anche a me .
    in realtà l'ho messo così perchè in origine era scritto in questo modo :
    s=""+get(i).toString(); ma mi dava errore

    Ho provato anche in questo modo, riesco a far tutto ma il file praticamente non lo vedo mai creato e non saprò mai se lo ha scritto oppure no
    
    try {
    			FileWriter fileout = new FileWriter("FileStampato.txt");
    			BufferedWriter filebuf = new BufferedWriter(fileout);
    			PrintWriter printout = new PrintWriter(filebuf);
    
    			printout.println("ciao");
    
    			printout.close();
    		}
    
    		catch (Exception e) {
    			System.out.println("ERRORE: "+e);
    			}
    		}
    		
    		
  • Re: Scrittura di un ArrayList su un file di testo

    cicciozza ha scritto:


    Questo metodo l'ho trovato cercando qua e la

    I campi li metto solo public?
    No no, allora, vediamo di abbozzare qualcosa di meglio.

    Classe Carta
    Non so come l'hai fatta tu. Per il numero sarebbe meglio un int. Per il seme va bene String. Se consideriamo solo le classiche carte francesi (cuori, quadri ecc...) andrebbe anche meglio una enum ma non so se conosci questa funzionalità introdotta in Java 5. Va bene String, non facciamo problemi su questo.
    Inoltre sarebbe bene e meglio che gli oggetti Carta siano "immutabili" (non ha granché senso cambiare i valori di una carta!).
    public class Carta {
        private final int numero;
        private final String seme;
    
        // costruttore che riceve numero e seme
        // solo i metodi "getter" (ovviamente essendo i campi final)
        // altro eventuale (es. toString)
    }

    Classe Mazzo (o MazzoDiCarte ... come vuoi)
    Dovrebbe contenere solo la lista di oggetti Carta, più metodi vari per la gestione (aggiunta carta, mescolamento, ecc...)
    public class Mazzo {
        private List<Carta> carte;
        
        // costruttore (potrebbe già anche ricevere N carte iniziali)
        // metodi vari (accedere alla Carta i-esima, aggiungi Carta, mescola, ecc...)
    }

    Classe FileMazzo
    Questa classe è utile per separare il I/O delle carte su file dal resto del codice.
    public class FileMazzo {
        private File file;
        
        // costruttore (riceve File)
        
        public void scriviMazzo(Mazzo mazzo) throws IOException {
            //....usa file
        }
        
        public Mazzo leggiMazzo() throws IOException {
            //....usa file
        }
    }
    Poi chiaramente almeno un'altra classe es. EsercizioCarte (o come vuoi) con il main e altro specifico dell'esercizio.

  • Re: Scrittura di un ArrayList su un file di testo

    No andbin, so cosa vuole il prof.
    Non ha senso mettere i numeri a String, o meglio, non è necessario.
    Non è quello che gli interessa.

    A me in questo momento serve solo un metodo "aggiustato" che scriva un arrayList su un file, in qualsiasi modo
  • Re: Scrittura di un ArrayList su un file di testo

    Più o meno ho risolto così
    try
    		{
    			FileOutputStream prova = new FileOutputStream("prova.txt");
    			PrintStream scrivi = new PrintStream(prova);
    		
    		scrivi.println(mazzomescolato);	}
    		
    		catch (IOException e)
    		{
    			System.out.println("Errore: " + e);
    			System.exit(1);
    		}
    	
    	}
  • Re: Scrittura di un ArrayList su un file di testo

    cicciozza ha scritto:


    No andbin, so cosa vuole il prof.
    Non ha senso mettere i numeri a String, o meglio, non è necessario.
    Non è quello che gli interessa.

    A me in questo momento serve solo un metodo "aggiustato" che scriva un arrayList su un file, in qualsiasi modo
    Ma secondo te, il metodo che hai trovato, funziona?

    Dal fatto che ho fatto questa domanda, ti dovrebbe essere ovvia la risposta!

    Il problema, allora, e': perche'?


    Rileggiti BENE quello che ha scritto @andbin, il quale, nella sua magnanimita', ti ha fornito informazioni FONDAMENTALI su come affrontare il problema.

    Tieni anche presente che tu CREDI di aver capito che cosa vuole il prof., mentre @andbin lo ha ben chiaro!

    Infine, per ESSERE SICURO di aver scritto EFFETTIVAMENTE qualcosa di sensato sul file, hai due opzioni: il file

    1) e' in un formato comprensibile/leggibile, quindi, aprendolo con un editor, sei in grado di confermare che EFFETTIVAMENTE e' stato salvato qualcosa
    2) e' i fomato binario, e allora devi implementare anche la LETTURA, quindi LEGGERE quanto salvato, per CONFERMARE che quello che e' presente sul file e' esattamente quello che ti aspettavi di aver salvato.

    Se tu provi ad implementare il punto 2) per la tua attuale soluzione, avrai una splendida sorpresa (no, non sara' una rossa mozzafiato )
  • Re: Scrittura di un ArrayList su un file di testo

    Mi spiego meglio visto il fraintendimento.
    Al prof non interessa, in questo caso, la perfetta gestione del programma.

    Infatti come da indicazioni nel testo d'esame nel mazzo ci sono solo 12 carte (3 per ogni seme)
    A lui di preciso interessa la "permutazione" casuale (non so se si dice proprio così), delle carte/stringhe e l'uso di arrayList.
    Poi alla fine chiede anche la scrittura su file.

    Questi grossomodo sono gli argomenti sui quali punta, fidati!
  • Re: Scrittura di un ArrayList su un file di testo

    Il TITOLO del tuo thread e' "Scrittura di un ArrayList su un file di testo", non "come fare una permutazione"!

    Le risposte sono relative al TITOLO del thread!
  • Re: Scrittura di un ArrayList su un file di testo

    E infatti non mi pare di aver chiesto come fare una permutazione.

    Se ti viene voglia di leggere senza presunzione, sopra chiedo esplicitamente aiuto per la scrittura su file dell'arraylist.

    Se ti viene voglia...
  • Re: Scrittura di un ArrayList su un file di testo

    Tu, pero', dovresti aver VOGLIA di LEGGERE le risposte

    Ma serve la voglia ...
  • Re: Scrittura di un ArrayList su un file di testo

    cicciozza ha scritto:


    chiedo esplicitamente aiuto per la scrittura su file dell'arraylist.
    Non hai neanche precisato quale deve essere il formato del file. Ci possono essere una marea di modi per scrivere i dati in modo che siano poi facilmente parsabili in lettura. L'unica cosa intuibile (e un minimo logica) è: una riga per carta.
    Che poi la riga della carta provenga da un toString() (della Carta) non è nemmeno detto che DEVE per forza essere così.
  • Re: Scrittura di un ArrayList su un file di testo

    E daje, quanta polemica!
    era un file di testo!
    un file txt, un dat, qualsiasi cosa andava bene
    un txt semplice, cmq ho risolto così
    	try
    		{
    			FileOutputStream prova = new FileOutputStream("prova.txt");
    			PrintStream scrivi = new PrintStream(prova);
    		
    		scrivi.println(mazzomescolato);	}
    		
    		catch (IOException e)
    		{
    			System.out.println("Errore: " + e);
    			System.exit(1);
    		}
    	
    	}
    
    Pace e grazie sempre andbin
  • Re: Scrittura di un ArrayList su un file di testo

    cicciozza ha scritto:


    E daje, quanta polemica!
    era un file di testo!
    Ma di quale polemica parli? Ti ho fatto notare una cosa importante: non avevi (prima ma anche fino ad adesso) descritto come deve essere fatto il file.

    A me la riga:

    scrivi.println(mazzomescolato);

    dice relativamente "poco". Da quanto vedo mazzomescolato è un ArrayList di oggetti Carta. Ora, ArrayList ha un suo toString() appropriato che fornisce una stringa in un certo formato ma presuppone che anche gli oggetti (Carta) nella lista abbiano un toString() appropriato.
    La classe Carta non l'hai postata, il suo toString() non sappiamo come sia fatto (e non l'hai descritto). Quindi anche adesso io NON ho assolutamente idea di cosa venga fuori nel tuo file.

    Se al tuo "prof" va bene il testo dal toString() di una collezione .... non ho nulla da obiettare. Non è un formato facilmente ri-parsabile ma ripeto, se vuole quello, ok.

    Quello che vorrei farti capire è che se chiedi solamente "dovrei scrivere il nuovo array "mazzomescolato" su un file di testo ed è qui che ho difficoltà" e NON spieghi COME deve essere fatto il file .... noi (altri del forum) NON lo possiamo sapere e non possiamo aiutarti più di tanto.
  • Re: Scrittura di un ArrayList su un file di testo

    Andbin, non ce l'avevo con te
Devi accedere o registrarti per scrivere nel forum
14 risposte