java.util.Scanner (Exemplos)

  1. neste exemplo apenas tokenizamos uma string com espaços

     

    import java.util.Scanner;

     

    public class Teste {

    public static void main(String[] args) {

    Scanner sc = new Scanner(args[0]);

    sc.useDelimiter(“\\s”); // regex que define delimitador

    while(sc.hasNext()){

    System.out.println(sc.next());

    }

    }

    }

     

    Execução: java Teste “pedro abs isso e um teste”

    Output:

    pedro

    abs

    isso

    e

    um

    teste

     

  2. Neste exemplo buscamos inteiros de maneira errada. O código certo para tanto se encontra nos exemplos e 4.

     

    O que eu suponha que aconteça neste caso é que como uma string é validada da esquerda para direita, os métodos ‘hasNextInt’ e ‘nextInt’ apenas reconhecem inteiros quando não concatenados com caractéres que não são inteiros, como por exemplo “d 32 30 m” não pode ser reconhecido como um número inteiro.

     

    import java.util.Scanner;

     

    public class Teste {

    public static void main(String[] args) {

    Scanner sc = new Scanner(args[0]);

    sc.useDelimiter(“\\s”);

    while(sc.hasNextInt()){

    System.out.println(sc.nextInt());

    }

    }

    }

     

     

    Execução: java Teste “pe 34 32 30”

    Output:

    (nada)

     

    Execução: java Teste “34 d 32 30 m”

    Output:

    34

     

    Execução: java Teste “34 32 30”

    Output:

    34

    32

    30

     

  3. Exemplo que busca inteiros

     

    Diferente do exemplo 2, podemos ver que o objeto da classe Scanner “quebra” a string “pedro 34 ju 32” em quatro tokens: [pedro], [34], [ju], [32]. O looping (genérico) percorre cada um desses tokens e o comando ‘if’ interno se certifica que há um novo inteiro pela frente. se houver então ele imprime através do comando ‘sc.nextInt()’.

     

    import java.util.Scanner;

     

    public class Teste {

    public static void main(String[] args) {

    Scanner sc = new Scanner(args[0]);

    while(sc.hasNext()){

    if (sc.hasNextInt()){

    System.out.println(sc.nextInt());

    } else {

    sc.next();

    }

    }

    }

    }

     

    Execução: java Teste “pedro 34 ju 32”

    Output:

    34

    32

     

  4. exemplo igual ao 3 exceto pela definição do delimitador ‘linha em negrito’

     

    import java.util.Scanner;

     

    public class Teste {

    public static void main(String[] args) {

    Scanner sc = new Scanner(args[0]);

    sc.useDelimiter(“\\s”);

    while(sc.hasNext()){

    if (sc.hasNextInt()){

    System.out.println(sc.nextInt());

    } else {

    sc.next();

    }

    }

    }

    }

     

    Execução: java Teste “pedro 34 ju 32”

    Output:

    34

    32

     

  5. Um teste um pouco maior de tokenização:

     

    Repare que a parte booleana deste código só reconhece o false que está no final de toda a string, pois os em vermelho não são reconhecidos como booleanos mas sim como string.

     

    “pedro abs 34 anos true, juliane 32 anos true. Pedro < Juliane false

     

    import java.util.Scanner;

     

    public class Teste {

    public static void main(String[] args) {

    Scanner sc = new Scanner(args[0]);

     

    int i = 0;

    boolean b = false;

    String s = “”;

     

    sc.useDelimiter(“\\s”);

     

    while(sc.hasNext()){

    if (sc.hasNextInt()){

    i = sc.nextInt();

    System.out.println(i + ” e um número inteiro”);

    } else if(sc.hasNextBoolean()){

    b = sc.nextBoolean();

    System.out.println(b + ” e um valor booleano”);

    } else {

    s = sc.next();

    System.out.println(“\'” + s + “\'” + ” e uma string”);

    }

    }

    }

    }

     

    Execução: java Teste “pedro abs 34 anos true, juliane 32 anos true. Pedro < Juliane false”

    Output:

    ‘pedro’ e uma string

    ‘abs’ e uma string

    34 e um n·mero inteiro

    ‘anos’ e uma string

    ‘true,’ e uma string

    ‘juliane’ e uma string

    32 e um n·mero inteiro

    ‘anos’ e uma string

    ‘true.’ e uma string

    ‘Pedro’ e uma string

    ‘<‘ e uma string

    ‘Juliane’ e uma string

    false e um valor booleano

     

     

    se mudarmos a linha
    ‘sc.useDelimiter(“\\s”);’
    para:
    ‘sc.useDelimiter(“[\\s,.]”);’
    o resultado será diferente:

     

    Execução: java Teste “pedro abs 34 anos true, juliane 32 anos true. Pedro < Juliane false”

    Output:

    ‘pedro’ e uma string

    ‘abs’ e uma string

    34 e um n·mero inteiro

    ‘anos’ e uma string

    true e um valor booleano

    ” e uma string

    ‘juliane’ e uma string

    32 e um n·mero inteiro

    ‘anos’ e uma string

    true e um valor booleano

    ” e uma string

    ‘Pedro’ e uma string

    ‘<‘ e uma string

    ‘Juliane’ e uma string

    false e um valor booleano

     

     

  6. Procurando texto usando Scanner

     

    Procure por todas as palavra que tem pelo menos 5 letras

     

    import java.util.Scanner;

     

    public class Teste {

    public static void main(String[] args) {

    Scanner sc = new Scanner(args[0]); // expression to look

    String token;

     

    do {

    token = sc.findInLine(args[1]); // regex potion

    System.out.println(“found: ” + token);

    }while(token !=null);

    }

    }

     

    Execução: java Teste “pedro abs 34 anos true, juliane 32 anos true. Pedro < Juliane false”
    “(\w{5,})”

    Output:

    found: pedro

    found: juliane

    found: Pedro

    found: Juliane

    found: false

    found: null → imprime null antes da verificação de saida na instrução ‘while’.

     

    Agora eu quero todas as palavras, menos os números, espaços, ‘<‘, ‘>’, ‘.’ e ‘,’.

    Execução: java Teste “pedro abs 34 anos true, juliane 32 anos true. Pedro < Juliane false”    “[^\s\d.<>,]+”
    Output:

    found: pedro
    found: abs
    found: anos
    found: true
    found: juliane
    found: anos
    found: true
    found: Pedro
    found: Juliane
    found: false
    found: null

     

Anúncios
Esta entrada foi publicada em java.util.* e java.text.*, REGEX com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

w

Connecting to %s