Páginas

domingo, 14 de março de 2010

Pausa para uma xícara de café

Em Java usamos a classe Scanner para separar uma fonte de dados em partes delimitadas por um delimitador específico. Quem é responsável pela entrada de dados é System.in e não Scanner. Por exemplo, vamos observar esse trecho de código:

Scanner sc = new Scanner(System.in); // declara um objeto
                                     // Scanner
String nome;
String endereco;

System.out.println("Digite o nome:");
nome = sc.next();                   // lê nome do teclado
System.out.println("Digite o endereço:");
endereco = sc.next();               // lê endereço do teclado
System.out.println(nome + ", " + endereco);

Se você, quando for pedido o nome, entrar por exemplo: "Joao da Silva", vai observar que nome irá receber "Joao" e endereco, "da". O programa nem irá solicitar a digitação do endereço. Isso acontece porque o delimitador padrão da classe Scanner é o espaço. Scanner é um tokenizador, ou seja, divide uma string em pedaços, e quem delimita esses pedaços, por padrão, é o espaço. Dessa forma quando digitamos "Joao da Silva", Scanner o divide em três pedaços. O primeiro ("João") é atribuido a nome, o segundo ("da") é atribuido a endereço e o terceiro fica perdido. Então, como solucionar isso? A boa notícia é que Scanner tem um método que permite alterar o delimitador. Inclua a seguinte linha após a declaração do objeto Scanner:

sc.useDelimiter(System.getProperty("line.separator"));

System.getProperty("line.separator") retorna o separador de linhas definido no sistema e passa para o método useDelimiter(), que o define como um novo delimitador para Scanner. Normalmente o separador de linhas é o "\n". No Windows é "\r\n". Dessa forma quando for solicitado o nome, tudo que for digitado até o "\n", será considerado parte da variável nome. Podemos definir qualquer string como delimitador ou mesmo uma expressão regular (regex). Scanner pode tokenizar quaisquer strings, não apenas o que é lido do teclado.

Nenhum comentário:

 
Creative Commons License
This work by Carlos Alberto P. Araújo is licensed under a Creative Commons Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil License.