Problema com lógica

9 respostas
oitathi

Alguém pode me dizer pq tah dando looping infinito???
Obrigada

public static void imprimir(ArrayList<Concessionaria> concessionarias, int num){
		System.out.println(concessionarias.get(num).getMarca());
 		if(concessionarias.get(num).getCarros().length > 0){
    			for(int i=0; i<concessionarias.get(num).getCarros().length;i++){
   				System.out.println(concessionarias.get(num).getCarros()[i].getModelo());
			}
		}
 		num++;
		while(num< concessionarias.size()){
			imprimir(concessionarias,num);
		}
	}

9 Respostas

Fellipex

Porque você não incrementa o num dentro do loop while, logo se num for menor que concessionarias.size(), será sempre infinito
para corrigir faça

while(num< concessionarias.size()){  
            imprimir(concessionarias,num);  
          num++
        }
Roger75

oitathi:
Alguém pode me dizer pq tah dando looping infinito???
Obrigada

public static void imprimir(ArrayList<Concessionaria> concessionarias, int num){ System.out.println(concessionarias.get(num).getMarca()); if(concessionarias.get(num).getCarros().length > 0){ for(int i=0; i<concessionarias.get(num).getCarros().length;i++){ System.out.println(concessionarias.get(num).getCarros()[i].getModelo()); } } num++; while(num< concessionarias.size()){ imprimir(concessionarias,num); } }

Neste trecho o num não está sendo incrementado dentro do while:

num++; while(num< concessionarias.size()){ imprimir(concessionarias,num); }

oitathi

ah tah!
tipo, eu mudei pra incrementar dentro e fora…
mas agora ele repete o último nome duas vezes

public static void imprimir(ArrayList<Concessionaria> concessionarias, int num){
		System.out.println(concessionarias.get(num).getMarca());
 		if(concessionarias.get(num).getCarros().length > 0){
    			for(int i=0; i<concessionarias.get(num).getCarros().length;i++){
   				System.out.println(concessionarias.get(num).getCarros()[i].getModelo());
			}
		}
 		num++;
		while(num< concessionarias.size()){
			imprimir(concessionarias,num++);
		}
	}
oitathi

ainda não entendo…
se eu colocar assim:

public static void imprimir(ArrayList<Concessionaria> concessionarias, int num){
		System.out.println(concessionarias.get(num).getMarca());
 		if(concessionarias.get(num).getCarros().length > 0){
    			for(int i=0; i<concessionarias.get(num).getCarros().length;i++){
   				System.out.println(concessionarias.get(num).getCarros()[i].getModelo());
			    }
		}
 		while(num< concessionarias.size()){
			imprimir(concessionarias,++num);
		}
	}

ele imprime certo, porém dah Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
por favor me expliquem

Fellipex

Se você fizer

++num

Você está incrementando antes de entrar no método logo você nunca acessará a posição zero, pois ja está passando 1, e no fim das contas vai dar a exceção indexOutOBounds, que significa que você tentou acessar uma posição que não existe no array.
Porque você não faz o que eu postei?

while(num< concessionarias.size()){    
           imprimir(concessionarias,num);    
           num++  
       }

Aqui você passa primeira 0, dai na proxima iteracao vai 1 e assim em diante, como deve ser. Acredito que ja vá resolver
Att

Fellipex

Só complementando o erro

Se um array tem tamanho 3, logo ele não tem o índice 3, pois é 0,1,2. Ou seja a ultima posição é a 2 e não a 3.
Att

E

Não gosto de usar o operador de auto-incremento. É que ele é muito sujeito a chuvas e trovoadas. Eu faria isto, no seu lugar:

public static void imprimir(ArrayList<Concessionaria> concessionarias, int num){  
        System.out.println(concessionarias.get(num).getMarca());  
        if(concessionarias.get(num).getCarros().length > 0){  
                for(int i=0; i<concessionarias.get(num).getCarros().length;i++){  
                System.out.println(concessionarias.get(num).getCarros()[i].getModelo());  
                }  
        }  
        for (int i = num; i < concessionarias.size(); ++i) {
            imprimir(concessionarias, i);  
        }  
    }

A propósito, isso parece coisa de professor querendo ensinar recursão na marra. É isso?

oitathi

Filipe, se eu usar o q vc diz, ele chama o metodo imprimir uma vez a mais…ou seja acaba imprimindo duas vezes o ultimo valor.

oitathi

mudando um pouco, caso vc puderem me ajudar… como eu escrevo a mesma função em js?
seria?

function imprimir(concessionarias, num){
			print(concessionarias[num].marca());
	 		if(concessionarias[num].carros().length > 0){
	    			for(var i=0; i<concessionarias[num].carros().length;i++){
	   				print(concessionarias[num].carros()[i].modelo());
				    }
			}
	 		while(num < concessionarias.length){
				imprimir(concessionarias,++num);
			}
	}

é que sou perdida em java script, e precisava dessa função em js…
alguém poderia me indicar o caminho das pedras?

Criado 21 de novembro de 2012
Ultima resposta 21 de nov. de 2012
Respostas 9
Participantes 4