Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106

    [JAVA] leggere interi da file

    Ragazzi ho un problema.....devo leggere dei dati da un file i quali posso essere di 2 tipologie:
    - string - un testo in cui sono presenti parole
    - int - un testo in cui ci sono solo interi
    Nel primo caso uso la string tokenizer , ma nel secondo caso ho un grosso problema visto che voglio prendere i valori e salvarli con INTERI.
    Difatti tutti i valori letti verranno salvati dentro a una struttura:
    - nel primo caso ArrayList<String>
    - nel secondo ArrayList<Integer>
    Come posso fare a leggere INTERI da file??
    C'e' un metodo che che posso usare per tutti i due casi??
    Devo per forze usare un metodo per leggere interi e uno per le stringhe???

  2. #2
    Quello che leggi da un file è sempre una stringa, per questo sei tu che devi conoscere quali campi sono poi per te stringhe o interi.
    Se vuoi unificare il tutto puoi provare al massimo così:

    codice:
    String linea = ...;
    ArrayList<String> listaStringhe = new ArrayList<String>();
    ArrayList<Integer> listaInteri = new ArrayList<Integer>();
    
    StringTokenizer st = new StringTokenizer(linea);
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        try {
             listaInteri.add(Integer.parseInt(token));
        }
        catch (Exception e) {
             listaStringhe.add(token);
        }
    }
    "Na' sedia te vojo tirà!"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    Eh immagino....pero' cosi non mi piace molto...(ovviamente è già qualcosa).
    Allora posso fare cosi, prima di effettuare la lettura da file do la possibilità di :
    "VUOI LEGGERE UN FILE CON STRINGHE?"
    "VUOI LEGGERE UN FILE CON INTERI?"
    In questa maniera sono già cosa voglio catturare....
    Ora cosa posso fare per catturare interi??
    Io sto provando facendo cosi:
    codice:
    Integer valore = Integer.parseInt((String) token.nextElement());
    Però quando vado a fare la somma di tutti gli elementi il risultato è un ammasso di interi messi a caso...
    E' possibile che java non abbia messo a disposizione un qualcosa per gestire queste cose???
    Non posso (e non vorrei) solo CASTARE per ottenere quello che voglio!!

  4. #4
    Che intendi con "ammasso di interi messi a caso"?
    Se io ho una riga composta, per esempio, da tre interi e li leggo sequenzialmente dov'è la casualità?
    Per rispondere poi alla tua domanda, ti ripeto che i file di testo non sono tipizzati e quindi per java sono sempre stringhe da convertire in quello che ti serve.
    Se vuoi fare una get tipizzata dei tuoi elementi devi usare un formato più complesso che possieda però una relativa API di accesso (Excel per esempio?).
    "Na' sedia te vojo tirà!"

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    Con il sistema scritto prima mi viene...sbagliavo da qualche parte....
    codice:
    Integer ciccio = 0;
    .
    .
    .
    Integer valore = Integer.parseInt((String) token.nextElement());
    					if(valore instanceof Integer){
    						ciccio = ciccio + valore;
    					}
    Cosi la somma mi viene giusta.
    Secondo te è una "porcata" gestirla in questo modo?? Però mi sa che è l'unico modo quindi...

  6. #6
    Originariamente inviato da albymotard
    Con il sistema scritto prima mi viene...sbagliavo da qualche parte....
    codice:
    Integer ciccio = 0;
    .
    .
    .
    Integer valore = Integer.parseInt((String) token.nextElement());
    					if(valore instanceof Integer){
    						ciccio = ciccio + valore;
    					}
    Cosi la somma mi viene giusta.
    Secondo te è una "porcata" gestirla in questo modo?? Però mi sa che è l'unico modo quindi...
    Scusami, ma che senso ha fare l'istance of di valore se esso è già dichiarato come Integer?

    Detto questo, io non ho ancora capito qual è il tuo problema a castarti gli oggetti a seconda di quello che devi prendere.
    "Na' sedia te vojo tirà!"

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    Si scusami...l'instanceof era per fare altri controlli...non ci va li...
    Invece per quanto riguarda i cast non c''è nessuno problema a sto punto??...nel senso quando li utilizzo mi sembra sempre di utilizzare un metodo "sporco"..secondo te scritto in quel modo va bene?

  8. #8
    Il cast non è un mezzo sporco ed è utile quando si utilizzano metodi che possono restituire oggetti di diverso tipo.
    Nel tuo caso non vedo la necessità di castare qualcosa (quello che leggi dal file sono sempre stringhe), ma al massimo di convertire.
    Continuo a suggerirti la prima soluzione che ti ho postato.
    "Na' sedia te vojo tirà!"

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Brazonet
    Quello che leggi da un file è sempre una stringa, per questo sei tu che devi conoscere quali campi sono poi per te stringhe o interi.
    Se vuoi unificare il tutto puoi provare al massimo così:

    codice:
    String linea = ...;
    ArrayList<String> listaStringhe = new ArrayList<String>();
    ArrayList<Integer> listaInteri = new ArrayList<Integer>();
    
    StringTokenizer st = new StringTokenizer(linea);
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        try {
             listaInteri.add(Integer.parseInt(token));
        }
        catch (Exception e) {
             listaStringhe.add(token);
        }
    }
    bruttina anche questa come soluzione, ma meglio di quella dell'autore del thread.
    Mi spiego: qui stai usando le eccezioni come mezzo per controllare il flusso di esecuzione (errato), tenuto conto che puoi non trasformare la stringa per qualsiasi motivo (visto che al max sarebbe da catchare una NumberFormatException).

    codice:
    String a = "12.0"; //Valid
    String b = "12.5"; //Invalid
    
    Pattern p = Pattern.compile( "([0-9]*)\\.[0]" );
    
    Matcher m = p.matcher(a);
    m.matches(); //TRUE
    
    Matcher m = p.matcher(b);
    m.matches(); //FALSE
    questo lo trovo un esempio migliore e ti individua gli interi (non double o float).
    Se la regex diventa

    Pattern p = Pattern.compile( "([0-9]*)" );

    hai solo i numeri.

    Testa bene questa soluzione, è la più elegante
    Potresti anche trasformare la stringa in array di char e chiederti se tutti sono caratteri (Character.isDigit()) , ma questa è una soluzione non ottimizzata
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Brazonet
    Quello che leggi da un file è sempre una stringa, per questo sei tu che devi conoscere quali campi sono poi per te stringhe o interi.
    Alla base l'I/O è sempre al byte non alla stringa, poi ad un livello più alto si possono fornire meccanismi per tipi di dato più complessi: tipi primitivi, stringhe ed oggetti serializzabili.
    Si può anche leggere direttamente degli int, basta sapere com'è strutturato il contenuto file.

    http://docs.oracle.com/javase/tutori...tastreams.html

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.