JAVA: Come analizzare i numeri Interi (delimitato da un numero variabile di spazi) in una riga di un file di testo

Voglio analizzare i numeri in una riga di un file di testo riga per riga. Per esempio, immaginate _ come spazio

mio file di testo il contenuto si presenta come:

___34_______45
_12___1000
____4______167
...

Penso che ho reso l’idea. Ogni riga può avere un numero variabile di spazi che separano i numeri, il che significa non c’è nessun disegno. La soluzione più semplice potrebbe essere letto char di char e verificare se è un numero e vai fino alla fine della stringa del numero e analizzarlo. Ma ci deve essere qualche altro modo.
Come faccio a leggere questo in Java automaticamente, in modo che posso ottenere in un certo datastructure dire array

[34,45]
[12,1000]
[4,167]

OriginaleL’autore Bob | 2012-09-17

3 Replies
  1. 11

    Utilizzare java.util.Scanner. Ha la nextInt() metodo, che fa esattamente quello che vuoi. Penso che dovrete metterli in un array “a mano”.

    import java.util.Scanner;
    public class A {
      public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int v1 = in.nextInt(); //34
        int v2 = in.nextInt(); //45
        ...
      }
    }
    Appena implementato nel mio codice. Favoloso, mai utilizzato questo scanner prima. Fresco thx!
    Contrassegnare la risposta accettata (il segno di spunta verde).

    OriginaleL’autore Jonathan Paulson

  2. 4

    Se si necessita solo di numeri in una struttura di dati, ad esempio in un array, quindi è possibile leggere il file con un Scanner e un semplice ciclo. Scanner utilizza gli spazi come il delimitatore predefinito, saltando più spazi.

    Dato List ints:

    Scanner scan = new Scanner(file); //or pass an InputStream, String
    while (scan.hasNext())
    {
        ints.add(scan.nextInt());
        //...

    Avrete bisogno per gestire le eccezioni in Scanner.nextInt.

    Ma la tua proposta di uscita dei dati di struttura, utilizza di più array, uno per riga. È possibile leggere il file utilizzando Scanner.nextLine() per ottenere le singole linee String. Quindi utilizzare String.split a attorno a dividere gli spazi con una regex:

    Scanner scan = new Scanner(file); //or InputStream
    String line;
    String[] strs;    
    while (scan.hasNextLine())
    {
        line = scan.nextLine();
    
        //trim so that we get rid of leading whitespace, which will end
        //   up in strs as an empty string
        strs = line.trim().split("\\s+");
    
        //convert strs to ints
    }

    Si potrebbe anche usare una seconda Scanner per simboleggiare ogni singola linea in un ciclo interno. Scanner rimuoverà tutti i principali spazi per voi, in modo che si può lasciare fuori il trim.

    È possibile evitare l’elemento vuoto penso che, facendo prima un trim() la stringa di prima divisione: strs = line.trim().split("\\s+").
    Vorrei aggiungere che il trim
    Penso, scanner.nextInt fa per me. Tuttavia ti dà il punto per l’espressione regolare \\s+
    Scanner.nextint consumerà tutti i numeri interi in un singolo ciclo, ma secondo la tua proposta di risultato, è anche bisogno di sapere quando si attraversa newline confini

    OriginaleL’autore pb2q

  3. 1

    Bum è di vecchia scuola, con BufferedReader e della Corda split() funzione:

    BufferedReader in = null;
    try {
        in = new BufferedReader(new FileReader(inputFile));
        String line;
        while ((line = in.readLine()) != null) {
            String[] inputLine = line.split("\\s+");
            //do something with your input array
        }
    } catch (Exception e) {
        //error logging
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (Exception ignored) {}
        }
    }

    (Se si utilizza Java 7, il finally blocco non è necessario se si utilizza il provare-con-le risorse.)

    Questo cambierà qualcosa come ______45___23 (dove _ è spazio) in un array ["45", "23"]. Se avete bisogno di quelli come numeri interi, è abbastanza banale scrivere una funzione per convertire la Stringa in un array in una matrice di int:

    public int[] convert(String[] s) {
        int[] out = new int[s.length];
        for (int i=0; i < out.length; i++) {
            out[i] = Integer.parseInt(s[i]);
        }
        return out;
    }
    Grazie. Scanner fa il lavoro per me. + per il blocco finally informazioni per Java 7

    OriginaleL’autore Roddy of the Frozen Peas

Lascia un commento