Ajuda sobre um código

13 respostas
E

Fiz um código que le uma linha e pega apenas alguns valores se uma condição for satisfeita.
Mas está gerando um erro, ele nao varre até o final do arquivo.

o código é este:

package coleta.control;
import java.io.*;
import java.util.Random;


public class TestaStreams{
	public static void main (String[] args) throws IOException{

    //Lendo e imprimindo linhas de um arquivo-texto para a console:
		FileReader reader = new FileReader("log6.txt");
		BufferedReader br = new BufferedReader(reader);
		String linha;
		//int linhasLidas = 0;
		
		while ((linha = br.readLine())!= null ){
//System.out.println(linha);
			
			String[] items = linha.split(","); 
			
			for (int i = 0; i < items.length; i++){
				
				
			if(items[i].equals("104"))
			{
			
			
			System.out.println(items[i+1]);
	   		System.out.println(items[i+2]);
	   		System.out.println(items[i+3]);
	   		System.out.println(items[i+4]);
	   		
			}   	
			  //linhasLidas++;
			    }
						
			System.out.println();
			
		}
				
	}

E ele gera o seguinte erro:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at coleta.control.TestaStreams.main(TestaStreams.java:31)

O que será isto? Na verdade quando eu tiro o
System.out.println(items[i+4]);

o programa roda normal.

me ajudem por favor.

13 Respostas

Lavieri

isso quer dizer que vc esta acessando um valor fora do range da array… ou seja… seu array não suporta um item com aquele index…

lembrando que, toda array inicia em 0 e vai ate length - 1

E

mas não sei como corrigir, de forma que rode corretamente…
vc teria como me dá uma luz?

Obrigado

Andre_Fonseca

oi,

Porque você tem que acessar a posição i+1, …, i+4??? coloque o .txt e explique o que vc precisa pegar e exibir…

E

um pedaço do txt é este
101,2009,47,853,0,0,0,0
102,2009,47,853,2.279,295.1,0
101,2009,47,854,0,0,0,0
102,2009,47,854,2.556,295,.05
101,2009,47,855,0,0,0,0
102,2009,47,855,2.025,294.9,.027
101,2009,47,856,0,0,0,0
102,2009,47,856,1.761,294.9,.047
101,2009,47,857,0,0,0,0
102,2009,47,857,2.254,294.9,.061
101,2009,47,858,0,0,0,0
102,2009,47,858,1.738,294.8,.059
101,2009,47,859,0,0,0,0
102,2009,47,859,1.454,294.8,.05
101,2009,47,900,0,0,0,0
102,2009,47,900,1.343,294.8,.07
103,2009,47,900,0,0,850,0,850
104,2009,47,900,1.849,3.528,853,0,850
101,2009,47,901,0,0,0,0
102,2009,47,901,.562,294.9,.057
101,2009,47,902,0,0,0,0
102,2009,47,902,.859,294.9,.05
101,2009,47,903,0,0,0,0
102,2009,47,903,1.184,294.9,0
101,2009,47,904,0,0,0,0
102,2009,47,904,1.517,294.9,.047
101,2009,47,905,0,0,0,0
102,2009,47,905,1.411,295,.082
101,2009,47,906,0,0,0,0
102,2009,47,906,1.449,295.1,.074
101,2009,47,907,0,0,0,0
102,2009,47,907,1.855,295.2,.072
101,2009,47,908,0,0,0,0
102,2009,47,908,1.914,295.3,.035
101,2009,47,909,0,0,0,0
102,2009,47,909,2.002,295.4,.047
101,2009,47,910,0,0,0,0
102,2009,47,910,1.615,295.5,.031
103,2009,47,910,0,0,900,0,900
[color=red]104,2009,47,910,1.437,3.038,908,0,900[/color]
101,2009,47,911,0,0,0,0
102,2009,47,911,1.122,295.6,.044
101,2009,47,912,0,0,0,0
102,2009,47,912,1.016,295.7,.082

Entao tenho que pegar os quatro números após cada “104”. Exemplo d linha vermelha, tenho que pegar 2009, 47, 910 (que significa ano, dia e hora que estarão no eixo x, e 1,437 que está no eixo y).

Ok?

Mas ainda não sei como farei isto.

Lavieri

segundo seu código… ele só rodaria se existir na sua linha 4 coisas apos a virgula… por exemplo

"104,algo,coisa,mais,uma"

se uma linha com 104 for como acima ele vai rodar… caso contrario… vc teria que fazer algo + ou - assim

if(items[i].equals("104") && items.length > i) for (int j = i+1; j < 5 || j < items.length; j++) //editei aqui para corrigir o operador || System.out.println(items[j]);

esse código acima le os 4 numeros apos a virgula… porem se não existir 4 número ele sai do for antes de tentar ler e dar OutOfBand

E

Ah tah… vou testar aqui…
flws.

Lavieri

outra coisa... o número 104 que vc ker... é sempre o 1° ??? ou ele pode estar no meio ?? se for sempre o 1° no lugar de usar o for como vc esta fazendo... que vc sempre percorre todos os itens do seu splint... vc pode percorrer apenas se o items[0] for equals a 104... por exemplo

package coleta.control;  
import java.io.*;  
import java.util.Random;  
  
  
public class TestaStreams{  
    public static void main (String[] args) throws IOException{  
  
    //Lendo e imprimindo linhas de um arquivo-texto para a console:  
        FileReader reader = new FileReader("log6.txt");  
        BufferedReader br = new BufferedReader(reader);  
        String linha;  
        //int linhasLidas = 0;  
          
        while ((linha = br.readLine())!= null ){  
//System.out.println(linha);  
              
            String[] items = linha.split(",");   
              
            if(items.length > 1 && items[0].equals("104"))  
               for (int i = 1; i < 5 || i < items.length; i++) //editei aqui para corrigir o operador ||
                  System.out.println(items[i]);
                          
            System.out.println();  
              
        }  
                  
    }
E

The operator || is undefined for the argument type(s) boolean, int

está dando esse erro.

Lavieri
eduardoesn:
The operator || is undefined for the argument type(s) boolean, int

está dando esse erro.

verdade modifiquei os 2 exemplos que coloquei...

tinha colocado
for (int i = 1; i < 5 || items.length; i++)  
//quando o correto seria
for (int i = 1; i < 5 || i < items.length; i++)  // <== forma correta


//e no outro exemplo coloquei


for (int j = i+1; j < 5 || items.length; j++)  
//quando o correto seria
for (int j = i+1; j < 5 || j < items.length; j++) // <== forma correta
E

corrigi, mas aparece tds os valores da linha…

Lavieri
eduardoesn:
corrigi, mas aparece tds os valores da linha...

ahauahua fazer sem testar da nisso... é verdade... troque o operador || pelo operador &&

pq na verdade tem que ser menor que 5 e menor que o tamanho da array

ficaria assim então...
public static void main (String[] args) throws IOException{    
    
    //Lendo e imprimindo linhas de um arquivo-texto para a console:    
        FileReader reader = new FileReader("log6.txt");    
        BufferedReader br = new BufferedReader(reader);    
        String linha;    
        //int linhasLidas = 0;    
            
        while ((linha = br.readLine())!= null ){    
//System.out.println(linha);    
                
            String[] items = linha.split(",");     
                
            if(items.length > 1 && items[0].equals("104"))    
               for (int i = 1; i < 5 && i < items.length; i++) //editei aqui para corrigir o operador ||  
                  System.out.println(items[i]);  
                            
            System.out.println();    
                
        }    
                    
}
E

perfeito camarada…
Obrigado…

agora, posso continuar pedindo sua ajuda?

E

com esses dados que me aparecem no console.
como faço pra criar um gráfico d linha.

2009
49
500
2.194

2009
49
510
1.918

2009
49
520
1.923

2009
49
530
2.408

2009
49
540
2.302

2009
49
550
2.242

2009
49
600
2.121

2009
49
610
2.094

2009
49
620
1.824

2009
49
630
1.56

2009
49
640
1.657

2009
49
650
1.985

2009
49
700
2.027

2009
49
710
2.021

2009
49
720
2.205

2009
49
730
2.249

2009
49
740
1.886

2009
49
750
1.907

2009
49
800
2.454

2009
49
810
2.758

2009
49
820
2.078

2009
49
830
2.42

2009
49
840
2.637

2009
49
850
2.272

Pegando os três primeiros no eixo x e o último valor no eixo y.

Criado 18 de fevereiro de 2009
Ultima resposta 18 de fev. de 2009
Respostas 13
Participantes 3