Como saber o fim da linha?

Olá,

Primeiramente gostaria de avisar que não sei se essa dúvida vem em java avançado ou básico.
Tenho um arquivo que estou lendo com Scanner utilizando nextInt(), porém eu não sei quando há quebra de linha. Supondo que meu arquivo seja:

[quote]1 3 1
2 2[/quote]

Utilizando nextInt() eu não sei como faço para separar o 1 3 1 do 2 2.

Alguém pode me dar uma luz? Obrigado.

tenta dar um .split("\n"); acredito que funcione. vai retorna um vetor de 2 posições.

Bom, se seu arquivo contem números separado por espaços os quais você deseja pegar, sugiro o seguinte:

Você faz a leitura por linha e captura todos e jogue na variavel String[]. :wink:

Quando não existir mais linhas o readLine retorna null.

try{ BufferedReader in = new BufferedReader(new FileReader("nome do arquivo")); if(in.readLine()!=null){ String[] numero=in.readLine().split(" "); ... //Os seus numeros vao estar na variavel [b]numero[/b] sequenciados. Ex: numeros[0], numero[1] ... e por aí vai. } }catch(Exception e){ e.getMessage(); }

Você não explicou muito bem como ta seu arquivo que irá ler mas creio que isso ajuda.

Não sei bem como seria esse .split("\n"); até onde sei eu uso isso em Strings, mas eu tenho um arquivo, não sei como usar direito. Até o momento eu tenho isso:

private static int[] getCadeia(Scanner in) { LinkedList<Integer> aux = new LinkedList<Integer>(); while(in.hasNextLine()){ //Esse while não faz sentido, estou tentando fazer enquanto não for o fim da linha. aux.add(in.nextInt()); } }

[quote=max.analista]Bom, se seu arquivo contem números separado por espaços os quais você deseja pegar, sugiro o seguinte:

Você faz a leitura por linha e captura todos e jogue na variavel String[]. :wink:

Quando não existir mais linhas o readLine retorna null.

try{ BufferedReader in = new BufferedReader(new FileReader("nome do arquivo")); if(in.readLine()!=null){ String[] numero=in.readLine().split(" "); ... //Os seus numeros vao estar na variavel [b]numero[/b] sequenciados. Ex: numeros[0], numero[1] ... e por aí vai. } }catch(Exception e){ e.getMessage(); }

Você não explicou muito bem como ta seu arquivo que irá ler mas creio que isso ajuda.

[/quote]

É, esqueci de um detalhe. Eu estava resolvendo esse problema utilizando split e tudo o mais, porém os números podem estar divididos por espaço, tab ou um misto dos dois, assim o split não funciona para todos os casos.

Mas me explica o seguinte, você estava conseguindo capturar os numeros e o problema era a verificação apenas na quebra de linha?
Porque se for apenas a quebra de linha, continue utilizando a forma que você está fazendo para ler os numeros e apenas verifique utilizando o readLine se existe mais linhas, se sim continue lendo, senão, vai retornar null e você terminou de ler o arquivo :wink:

Agora se o problema é a leitura, aí você me explica direitinho como ta o seu arquivo para que possamos pensar numa estrategia de filtragem.

[quote=max.analista]Mas me explica o seguinte, você estava conseguindo capturar os numeros e o problema era a verificação apenas na quebra de linha?
Porque se for apenas a quebra de linha, continue utilizando a forma que você está fazendo para ler os numeros e apenas verifique utilizando o readLine se existe mais linhas, se sim continue lendo, senão, vai retornar null e você terminou de ler o arquivo :wink:

Agora se o problema é a leitura, aí você me explica direitinho como ta o seu arquivo para que possamos pensar numa estrategia de filtragem. [/quote]

Vou tentar te explicar melhor:

O arquivo vai conter diversos números em diversas linhas divididos por espaço ou tab ou um misto dos dois.
Eu consigo ler os números, mas cada linha tem que estar em um array de int diferente, eu não sei como saber se pulei uma linha ou se continuo na mesma linha.
Até o momento eu tenho o código:

private static Object[] getCadeia(Scanner in) { LinkedList<Integer> aux = new LinkedList<Integer>(); while(in.hasNextLine()){ //Esse while não faz sentido, estou tentando fazer enquanto não for o fim da linha. aux.add(in.nextInt()); } return aux.toArray(); }

Ignorando todo tipo de conversão para inteiro ou coisas do gênero.
O problema está no while, eu quero que ele leia os inteiros até chegar no fim da linha, depois disso ele para porque o próximo número pertence a outra cadeia.
Do jeito que está ele não consegue diferenciar as linhas e lê inteiro por inteiro como se estivessem na mesma linha, não sei como faço para arrumar isso.
Um exemplo de arquivo seria:

[quote]1 3 1
1 4 6 5
13
324[/quote]

O método split, da classe String recebe uma expressão regular como argumento, portanto ele não procurar pela String que você definiu, mas sim o que casa com o Pattern que você enviou.

Onde isso é útil pra você?

É útil porque você pode enviar um padrão que case tanto com espaços em branco, quanto com tabs, e tudo funciona bem, veja só:

a expressão regular “\s” indica qualquer caractere de espaço em branco, seja tab ou o que for, se combinada com o quantificador +, ela vai casar com eles em qualquer quantidade, então o split vai remover qualquer espaço em branco, faça o teste: public static void main(String[] args){ String str = "1 3 1 4 5 7 8 9"; String values[] = str.split("\\s+"); for(String s : values){ System.out.println(s); } }

[quote=digaoneves]O método split, da classe String recebe uma expressão regular como argumento, portanto ele não procurar pela String que você definiu, mas sim o que casa com o Pattern que você enviou.

Onde isso é útil pra você?

É útil porque você pode enviar um padrão que case tanto com espaços em branco, quanto com tabs, e tudo funciona bem, veja só:

a expressão regular “\s” indica qualquer caractere de espaço em branco, seja tab ou o que for, se combinada com o quantificador +, ela vai casar com eles em qualquer quantidade, então o split vai remover qualquer espaço em branco, faça o teste: public static void main(String[] args){ String str = "1 3 1 4 5 7 8 9"; String values[] = str.split("\\s+"); for(String s : values){ System.out.println(s); } }
[/quote]

Muito obrigado, não tenho palavras para dizer o quanto isso ajudou! Eu tinha lido que o método split poderia receber uma regex, mas não sei ainda como montar elas, você tem algum tutorial ou link para me mandar onde eu possa aprender mais sobre a construção das mesmas?

Opa, sem problemas. :slight_smile:

Te recomendo o material que eu usei pra aprender, o material do aurélio.

Tem o site dele: http://aurelio.net/regex/
E o livro que ele tem, muito fácil de ler, muito didático, e vai te ensinar praticamente tudo o que precisa saber sobre regex: http://www.piazinho.com.br/