chi mi spiega una cosa di java?
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 11 di 11

Discussione: chi mi spiega una cosa di java?

Cambio titolo
  1. #1
    Dendrofilia L'avatar di Bigville
    Registrato il
    02-05
    Messaggi
    22.651

    chi mi spiega una cosa di java?

    come si legge da file?
    ad esempio in un programma ho letto
    Spoiler:

    Inventario dei capi di abbigliamento
    ====================================

    Descrizione
    -----------

    Implementare le seguenti classi:
    - Capo, le cui istanze rappresentano generici capi di abbigliamento e sono
    caratterizzate da colore, taglia e prezzo in Euro (identificati da
    espressioni di tipo String, int e double, rispettivamente);
    - Camicia, le cui istanze rappresentano camicie e sono caratterizzate, oltre
    che da quanto descritto per la classe Capo, da numero di bottoni e presenza
    o meno di asole per gemelli (identificati rispettivamente da espressioni di
    tipo int e boolean);
    - Pantalone, le cui istanze rappresentano pantaloni e sono caratterizzate,
    oltre che da quanto descritto per la classe Capo, dalla lunghezza espressa
    in centimetri (identificata da un'espressione di tipo int);
    - Gonna, le cui istanze rappresentano gonne e sono caratterizzate, oltre che da
    quanto descritto per la classe Capo, da lunghezza e tipo di materiale
    (identificati rispettivamente da espressioni di tipo int e String);
    - Cappotto, le cui istanze rappresentano cappotti e sono caratterizzate, oltre
    che da quanto descritto per la classe Capo, dal tipo di materiale
    (identificato da un'espressione di tipo String).

    Implementare infine nella classe Soluzione un metodo main che legga da file la
    descrizione di una serie di capi di abbigliamento e stampi il prezzo
    dell'ultimo capo avente colore rosso, o alternativamente stampi 0.0 nel caso in
    cui la descrizione non contenga alcun capo rosso.


    Il nome del file andra' specificato come argomento dalla linea di comando.

    Vincoli
    -------

    Il file da leggere conterra' la descrizione di un capo di abbigliamento per
    ogni sua riga, nel seguente formato:

    - la descrizione inizia con una stringa che identifica il tipo di capo e che
    puo' assumere solamente i valori "CAMICIA", "PANTALONE", "GONNA" e
    "CAPPOTTO" (pena emissione di una IllegalArgumentException, che fa parte di
    java.lang e che estende RuntimeException);
    - la riga continua elencando i valori che identificano il particolare capo di
    abbigliamento, nel medesimo ordine indicato nella descrizione della classe
    corrispondente e utilizzando gli spazi come caratteri separatori;
    - l'unica eccezione riguarda l'ultima caratteristica della classe Camicia: le
    corrispondenti righe nel file termineranno con la stringa "GEMELLI" oppure
    con la stringa "BOTTONI" a seconda che la camicia abbia o meno asole per
    gemelli.

    Per esempio, il seguente file (le righe composte esclusivamente da trattini
    delimitano l'inizio e la fine)
    ------
    CAMICIA BIANCO 46 35.00 7 GEMELLI
    CAMICIA BLU 48 26.50 6 BOTTONI
    GONNA GIALLO 42 21.99 40 COTONE
    CAPPOTTO NERO 50 270.00 LANA
    PANTALONE MARRONE 46 40.00 120
    ------
    indica un insieme di indumenti composti da una camicia bianca di taglia 46,
    prezzo pari a 35 Euro, con sette bottoni e asole per gemelli, da una camicia
    blu di taglia 48, prezzo di 26.50 Euro, sei bottoni e senza asole per gemelli,
    una gonna gialla di taglia 42, prezzo pari a 21.99 Euro, lunga 40 centimetri e
    di cotone, e cosi' via.

    Ipotizzare che i colori vengano indicati sempre al maschile singolare, e che
    tutte le stringhe siano eslusivamente composte da caratteri maiuscoli.

    Esempi
    ------

    Ipotizzando che il file sopra descritto abbia nome inventario.txt, eseguendo
    $ java Soluzione inventario.txt
    si otterrebbe come output
    0.0

    Nel caso invece il file avesse il contenuto seguente
    ------
    CAMICIA BIANCO 46 35.00 7 GEMELLI
    CAMICIA ROSSO 48 26.50 6 BOTTONI
    GONNA GIALLO 42 21.99 40 COTONE
    CAPPOTTO NERO 50 270.00 LANA
    GONNA ROSSO 40 29.00 30 COTONE
    PANTALONE MARRONE 46 40.00 120
    ------
    l'output del programma dovrebbe essere
    29.00


    Suggerimenti
    ------------
    Elaborare le informazioni comuni alle varie classi in un unico punto, piuttosto
    che scrivere codice duplicato.


    per prima cosa.. COSA DIAVOLO VUOL DIRE IL NOME DEL FILE HA IL NOME PASSATO COME ARGOMENTO DA LINEA DI COMANDO?? non è che non ho capito cosa voglia dire, mi chiedo come si possa fare..
    chi mi aiuta?

    per seconda cosa, aggiungo, la parte in grassetto come si fa?
    cioè il programma sembra semplicissimo, ma come cavolo si fanno quelle cose via linea di comando?
    a me hanno solo insegnato (teoricamente) ad accettare in input i parametri di string [] args, fine..
    Ultima modifica di Bigville; 24-02-2011 alle 18:00:12


  2. #2
    The Hermit
    Ospite
    Comincio a risponderti per la parte in rosso che è la più semplice, il resto lo leggo domani che non ho molto tempo adesso:
    Codice:
    public static void main(String[] args) {
            String nomeFile;
            
            if(args != null && args.length > 0 && args[0] != null) {
                nomeFile = args[0];
            } else {
                System.out.println("Per avviare il programma serve specificare il parametro nome del file");
                return;
            }
            
            System.out.println("nomeFile = " + nomeFile);
        }
    Questo semplicissimo main assegna alla variabile nomeFile il primo parametro passato come argomento da linea di comando. Per provarlo puoi fare in 2 modi:
    1) se compili a mano e/o non usi un IDE: compila la classe (supponiamo di chiamarla Test) che contiene questo main, poi dal prompt eseguilo prima così "java Test" e poi "java Test pippo.txt".
    Nel primo caso vedrai il messaggio che ti avvisa che è nessario specificare un nome file, nel secondo vedrai "nomeFile = pippo.txt".
    2) se usi un IDE quando esegui la tua classe devi passare un argomento perché vada a buon fine la prova (ad esempio in Eclipse devi mettere il parametro nel tab arguments di run --> run configurations ...)

  3. #3
    Dendrofilia L'avatar di Bigville
    Registrato il
    02-05
    Messaggi
    22.651
    Citazione The Hermit Visualizza Messaggio
    Comincio a risponderti per la parte in rosso che è la più semplice, il resto lo leggo domani che non ho molto tempo adesso:
    Codice:
    public static void main(String[] args) {
            String nomeFile;
            
            if(args != null && args.length > 0 && args[0] != null) {
                nomeFile = args[0];
            } else {
                System.out.println("Per avviare il programma serve specificare il parametro nome del file");
                return;
            }
            
            System.out.println("nomeFile = " + nomeFile);
        }
    Questo semplicissimo main assegna alla variabile nomeFile il primo parametro passato come argomento da linea di comando. Per provarlo puoi fare in 2 modi:
    1) se compili a mano e/o non usi un IDE: compila la classe (supponiamo di chiamarla Test) che contiene questo main, poi dal prompt eseguilo prima così "java Test" e poi "java Test pippo.txt".
    Nel primo caso vedrai il messaggio che ti avvisa che è nessario specificare un nome file, nel secondo vedrai "nomeFile = pippo.txt".
    2) se usi un IDE quando esegui la tua classe devi passare un argomento perché vada a buon fine la prova (ad esempio in Eclipse devi mettere il parametro nel tab arguments di run --> run configurations ...)
    grazie per la risposta intanto
    sì quello l'avevo capito dell'args[0], ma non capisco come faccio a dirgli di prendere quella stringa e trasformarla nel nome del file..
    io avevo pensato uno Scanner sc=new Scanner(new file(nomeFile+".txt");
    però non so quanto corretto sia..
    domani cmq provo, perchè la parte in grassetto non la sapevo grazie mille


  4. #4
    The Hermit
    Ospite
    Quell'istruzione per usare i file non l'ho mai vista, non credo possa funzionare. Adesso sono in ufficio, questa sera provo a buttare giù un po' di codice

  5. #5
    Dendrofilia L'avatar di Bigville
    Registrato il
    02-05
    Messaggi
    22.651
    Citazione The Hermit Visualizza Messaggio
    Quell'istruzione per usare i file non l'ho mai vista, non credo possa funzionare. Adesso sono in ufficio, questa sera provo a buttare giù un po' di codice
    ottimo
    ok grazie, fai con calma quando hai tempo.. è solo per capire quella cosa.. il programma in sè non è nulla di particolare..

    più che altro ci avevano insegnato
    Scanner sc=new Scanner(new file("esempio.txt");
    quindi ho pensato, gli do il nome usando la stringa data aggiungendo un .txt


  6. #6
    The Hermit
    Ospite
    Oopps errore mio, non avevo mai usato quel sistema per leggere un file, ma funziona, probabilmente non è il più efficiente ma funziona!
    Ad esempio:
    Codice:
    try {
                Scanner scanner = new Scanner(new File(path + nomeFile));
                while(scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            } catch (FileNotFoundException e) {
                System.out.println("Impossibile trovare il file");
            }
    L'istruzione "scanner.nextLine()" legge una completa riga del file (fino al carattere a capo, cioè "\n" o "\r\n"). La variabile path contiene il percorso assoluto alla cartella in cui si trova il file, si può fare usando i percorsi relativi ma così è più immediato.

    La tua idea di usare il parametro passato più ".txt" per identificare il file è corretta come puoi vedere, volendo si può passare come parametro direttamente il nome del file completo di estensione, ma cambia poco.

    Qualche consiglio sparso:
    - per la realizzazione delle varie classi usa l'ereditarietà a partire dalla classe Capo;
    - per la conversione del contenuto di una riga del file nella classe corrispondente, vengono molto molto utili gli Enum.

    Se ti serve altro aiuto fai sapere.

  7. #7
    Dendrofilia L'avatar di Bigville
    Registrato il
    02-05
    Messaggi
    22.651
    Citazione The Hermit Visualizza Messaggio
    Oopps errore mio, non avevo mai usato quel sistema per leggere un file, ma funziona, probabilmente non è il più efficiente ma funziona!
    Ad esempio:
    Codice:
    try {
                Scanner scanner = new Scanner(new File(path + nomeFile));
                while(scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            } catch (FileNotFoundException e) {
                System.out.println("Impossibile trovare il file");
            }
    L'istruzione "scanner.nextLine()" legge una completa riga del file (fino al carattere a capo, cioè "\n" o "\r\n"). La variabile path contiene il percorso assoluto alla cartella in cui si trova il file, si può fare usando i percorsi relativi ma così è più immediato.

    La tua idea di usare il parametro passato più ".txt" per identificare il file è corretta come puoi vedere, volendo si può passare come parametro direttamente il nome del file completo di estensione, ma cambia poco.

    Qualche consiglio sparso:
    - per la realizzazione delle varie classi usa l'ereditarietà a partire dalla classe Capo;
    - per la conversione del contenuto di una riga del file nella classe corrispondente, vengono molto molto utili gli Enum.

    Se ti serve altro aiuto fai sapere.
    ok, grazie mille.. rimane sempre il solito dubbio che non riesco proprio a comprendere.. ti faccio l'ultima domanda..
    Scanner scanner = new Scanner(new File(path + nomeFile));
    cioè mettiamo che il percorso assoluto sia C:/Documenti/esercizio/
    dove qui dentro c'è tutto.. e il parametro passato da linea di comando è "es".
    come fai a dirgli di prendere il nome es e creare es.txt in C:/Documenti/esercizio/ dove poi si farà tutto l'esercizio?
    non c'è bisogno che scrivi tutto il codice, solo quelle due righette per comprendere..
    il fatto è che quella puntini puntini non c'ha spiegato il metodo di dare il nome a un file in questo modo, ma nei suoi esami lo mette.

    riguardo ai due consigli che mi hai detto grazie, per il primo sì, è la stessa idea che avevo, per il secondo, il fatto è che l'esame consiste nell'usare le cose che ci ha "spiegato" lei, cioè Scanner e poco altro. fine. se usi altro viene dato un errore.. è una lunga storia, ma non puoi usare ciò che ti pare. Cioè se tu sai che c'è un metodo più efficiente ti attacchi, devi usare ciò che ha spiegato lei. Quando l'ho saputo son rimasto così -->


    "La tua idea di usare il parametro passato più ".txt" per identificare il file è corretta come puoi vedere, volendo si può passare come parametro direttamente il nome del file completo di estensione, ma cambia poco."
    alla fine a me interessa qualcosa che vada, non che sia meglio di altro il 18 mi basta.. ma ti ho chiesto l'ultima cosa così finalmente posso dire di aver compreso una cosa


    EDIT:
    ah forse ho capito..
    Codice:
    public static void main(String[] args) {
            String nomeFile;
            nomeFile = args[0];
        }
    
    
    try {
                Scanner scanner = new Scanner(new File(C:/Documenti/esercizio/ + nomeFile));
                while(scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            } catch (FileNotFoundException e) {
                System.out.println("Impossibile trovare il file");
            }
    cioè, questo intendi? però non c'è bisogno di virgolette? domani provo seriamente va, così evito domande inutili
    Ultima modifica di Bigville; 26-02-2011 alle 01:04:39


  8. #8
    The Hermit
    Ospite
    Citazione Bigville Visualizza Messaggio
    EDIT:
    ah forse ho capito..
    Codice:
    public static void main(String[] args) {
            String nomeFile;
            nomeFile = args[0];
        }
    
    
    try {
                Scanner scanner = new Scanner(new File("C:/Documenti/esercizio/" + nomeFile));
                while(scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            } catch (FileNotFoundException e) {
                System.out.println("Impossibile trovare il file");
            }
    cioè, questo intendi? però non c'è bisogno di virgolette? domani provo seriamente va, così evito domande inutili
    No le virgolette ci vanno, quel metodo vuole una stringa come argomento, quindi il percorso al file deve essere una stringa. In pratica con quell'istruzione stai dicendo di lavorare col file che si trova in quel percorso e ha il nome che hai preso da riga di comando. Così facendo però si suppone che il file esista già, altrimenti lancia una FileNotFoundException. Se devi anche creare il file per poi metterci dentro le righe per fare le prove che l'esercizio richiede occorre mettere qualche linea in più:
    1) Creazione del file se non esiste
    Codice:
    File f = new File("E:/test/" + nomeFile);
            if (!f.exists()) {
                try {
                    f.createNewFile();
                } catch (IOException e) {
                    System.out.println("Impossibile creare il file!\n"
                            + e.getMessage());
                    return;
                }
            }
    2) Scrittura dati nel file
    Codice:
    try {
                Writer writer = new FileWriter(f);
                writer.append("GONNA BLU 44 30.99 28 LINO");
                writer.flush();
                writer.close();
            } catch (IOException e) {
                System.out.println("Impossibile scrivere nel file!\n"
                        + e.getMessage());
                return;
            }
    3) La lettura è uguale a prima
    Codice:
    try {
                Scanner scanner = new Scanner(f);
                while (scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
                scanner.close();
            } catch (FileNotFoundException e) {
                System.out.println("Impossibile trovare il file");
            }
    Queste sono le operazioni principali, dai comunque uno sguardo al Javadoc della classe File se vuoi altri metodi utili (delete(), canRead(), canWrite(), ecc).

    Edit: molto simpatica la prof, davvero un comportamento utile

  9. #9
    Dendrofilia L'avatar di Bigville
    Registrato il
    02-05
    Messaggi
    22.651
    Citazione The Hermit Visualizza Messaggio
    No le virgolette ci vanno, quel metodo vuole una stringa come argomento, quindi il percorso al file deve essere una stringa. In pratica con quell'istruzione stai dicendo di lavorare col file che si trova in quel percorso e ha il nome che hai preso da riga di comando. Così facendo però si suppone che il file esista già, altrimenti lancia una FileNotFoundException. Se devi anche creare il file per poi metterci dentro le righe per fare le prove che l'esercizio richiede occorre mettere qualche linea in più:
    1) Creazione del file se non esiste
    Codice:
    File f = new File("E:/test/" + nomeFile);
            if (!f.exists()) {
                try {
                    f.createNewFile();
                } catch (IOException e) {
                    System.out.println("Impossibile creare il file!\n"
                            + e.getMessage());
                    return;
                }
            }
    riguardo a questo si attacca e si accontenta

    ma se metto solo il nome del file senza percorso non dovrebbe creare li il file?
    2) Scrittura dati nel file
    Codice:
    try {
                Writer writer = new FileWriter(f);
                writer.append("GONNA BLU 44 30.99 28 LINO");
                writer.flush();
                writer.close();
            } catch (IOException e) {
                System.out.println("Impossibile scrivere nel file!\n"
                        + e.getMessage());
                return;
            }
    3) La lettura è uguale a prima
    Codice:
    try {
                Scanner scanner = new Scanner(f);
                while (scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
                scanner.close();
            } catch (FileNotFoundException e) {
                System.out.println("Impossibile trovare il file");
            }
    Queste sono le operazioni principali, dai comunque uno sguardo al Javadoc della classe File se vuoi altri metodi utili (delete(), canRead(), canWrite(), ecc).

    Edit: molto simpatica la prof, davvero un comportamento utile
    ok grazie ancora.. mi studio bene il writer che mi sembra interessante..
    poi il try catch nonce l'ha spiegato.. ci ha fatto aggiungere dopo il main throws IOException.. fine
    ma un bel bigliettazzo ci sta con le cose che non ha spiegato ma che semmai servono


  10. #10
    The Hermit
    Ospite
    Citazione Bigville Visualizza Messaggio
    ma se metto solo il nome del file senza percorso non dovrebbe creare li il file?
    No, cambia solo dove cerca il file, però appena cerchi di leggere/scrivere in quel file ti becchi una IOException o una FileNotFoundException.

    Citazione Bigville Visualizza Messaggio
    ok grazie ancora.. mi studio bene il writer che mi sembra interessante..
    poi il try catch nonce l'ha spiegato.. ci ha fatto aggiungere dopo il main throws IOException.. fine
    ma un bel bigliettazzo ci sta con le cose che non ha spiegato ma che semmai servono
    Io il try/catch l'ho messo perché è buona norma intercettare le eccezioni piuttosto che limitarsi a lanciarle con thorws nella firma del metodo.

  11. #11
    Dendrofilia L'avatar di Bigville
    Registrato il
    02-05
    Messaggi
    22.651
    Citazione The Hermit Visualizza Messaggio
    No, cambia solo dove cerca il file, però appena cerchi di leggere/scrivere in quel file ti becchi una IOException o una FileNotFoundException.
    ok, credevo.. perfetto

    Io il try/catch l'ho messo perché è buona norma intercettare le eccezioni piuttosto che limitarsi a lanciarle con thorws nella firma del metodo.
    sì so che è meglio usare il try catch, infatti me lo sono annotato solo che quella neanche ce l'ha spiegato bah

    ho finito le domande, non passerò mai quell'esame ma almeno so queste cose
    molte grazie per l'aiuto


Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •