Duvida com Array, Objetos e condição if

30 respostas
gabrieltosi

Bom dia, estou estudando pela apostila da Caelum e me surgiu uma duvida em um exercício que não estou conseguindo imaginar como resolver.

Bem objetivo do exercício é criar uma Casa, adicionar portas, abrir e fechar as portas e escrever um método que retorne em int a quantidade de portas abertas.

Para isso criei esse metodo.

public void abrePorta(Integer Portas){ 
		
		for (int i = 0; i < portas.length; i++){
			
			if (Portas == i){
				
				aberta = true;
				System.out.println("A porta " + Portas + " foi aberta");
		
			}
		}
		
	}//fim do metodo abrePorta

e para descobrir se uma porta está aberta, criei esse outro método.

public int quantasPortasEstãoAbertas(){
	
		for (int i = 0; i < portas.length; i++){
			
			
			if (//aqui dentro tem que haver uma condição se a referência a objeto dentro da array portas
				//for abertas == true. E ele deve retornar em int quantos desses objetos tem essa condição
				//como verdadeira)
					{
				
				
				
			}//fim da condição if
			
		}//fim do loop
		return 1;
		
	}//fim do metodo quantasPortasEstãoAbertas

Meu problema é justamente esse que eu escrevi dentro da condição If. Eu sei que com o for eu vou percorrer toda a array, e for checaria cada elemento da Array para ver se a condição (Elemento == aberta) era true, ai ele armazenaria essa posição e depois deveria ver quantas dessas condições foram verdadeiras, e me retornar esse valor. Mas como eu ponho isso com código?

Alguém poderia me ajudar?
Muito grato.

30 Respostas

Rodrigo_Sasaki

Você poderia usar um contador, que é incrementado sempre que for encontrada uma porta aberta no seu laço.

gabrieltosi

Algo como?

return i=+i;

Tipo isso? Mas o que eu ponho na condição if? Isso tbm ta me pegando, não to conseguindo achar uma saída.

gabrieltosi

Pensei em por algo como isso:

if (portas[i] == aberta){
				
				
				return i = 0 + i;
				
			}//fim da condição if

mas o eclipse diz que aquela condição dentro do If é um erro, “Incopatible operands types Integer and Boolean”.

Rodrigo_Sasaki
Você tem que entender o escopo da sua variável. Se ela for criada dentro do laço, quando o laço terminar de ser executado, você perde a referência dela. Portanto tem que instanciá-la fora do laço. e o incrementar, você pode fazer igual incrementa a variavel 'i', do seu laço for:
public void metodo(boolean flag){
    
    int counter = 0;

    for (int i = 0; i < portas.length; i++){  
        if(portas[i].isAberta(){
            counter++;
        }
    }

    System.out.println("Portas abertas ==> "+counter);

}
S

O array portas[] é de que tipo? E a variavel aberta é de que tipo?

gabrieltosi

O que seria esse

if(portas[i].isAberta()

eu pus essa mesma condição aqui, e deu erro :cry:
Pq será que não está funcionando?

gabrieltosi

Boolean aberta;
Integer portas[];

Rodrigo_Sasaki
gabrieltosi:
Sem_Nome:
O array portas[] é de que tipo? E a variavel aberta é de que tipo?

Boolean aberta;
Integer portas[];


Opa, já começou errado :)

A ideia é você ter uma Casa, com Portas dentro, porém Porta é um objeto também. Teria que ser mais ou menos assim:
class Porta{

    private boolean aberta;

    // métodos

}

class Casa {

    private Porta[] portas;

    // métodos

}
S

Caso você de continuidade ao raciocinio do digaoneves o seu if ficará assim:

if(portas[i].isAberta()) {

//sua logica

}
gabrieltosi

Ahhh sim entendi, vou tentar fazer exatamente isso aqui.
Se não for pedir de mais, poderia me explicar como eu chegaria ao raciocínio que porta é um objeto tbm?

S
gabrieltosi:
Ahhh sim entendi, vou tentar fazer exatamente isso aqui. Se não for pedir de mais, poderia me explicar como eu chegaria ao raciocínio que porta é um objeto tbm?

Simples. Uma porta tem vários atributos, como tamanho, cor, aberta/fechada, etc...

Você declara a porta como uma classe assim:

class Porta {

private boolean aberta;
private int tamanho;
private String cor;

//getter e setters necessários

}
E na classe casa você coloca:
class Casa {

private Porta[] porta;
//resto do codigo
}

Não esqueça que você PRECISA instanciar o array porta.

Rodrigo_Sasaki
Não se esqueça que Porta tem comportamentos também, portanto seguindo a linha do Sem_Nome, implemente a seguinte classe:
class Porta {  
  
    private boolean aberta;  
    private int tamanho;  
    private String cor;  

    public void abrir(){

    }

    public void fechar(){

    }
  
    //getter e setters necessários  
  
}
gabrieltosi

Fiz exatamente como o recomendado.

public class Portas {

	String cor;
	Boolean aberta;
	Portas portas[];
	
	/** 
	 * Adiciona portas a array portas[]
	 * 
	 * */
	
	public void adicionaPorta(Portas x){
		
		for (int i = 1; i < portas.length;i++){
			
			if (portas[i] == null){
				
				portas[i] = x;
				System.out.println("A porta nº" + i + " foi criada");
				break;
				
				
			}//fim da condição if
			
		}//fim do loop
		
		
	}//fim do metodo adiconaPorta
	
	
	/** 
	 * Esse metodo abre a Porta
	 * 
	 * */
	
	public void abrePorta(Portas x){ 
		
		for (int i = 0; i < portas.length; i++){
			
			if (x == /**a posição dele dentro do array*/){
				
				aberta = true;
				System.out.println("A porta " + x + " foi aberta");
		
			}
		}
		
	}//fim do metodo abrePorta

Só que agora que mudei a array de Integer portas[], para Porta portas[], tenho que mudar o método abrePorta(), e não sei como referir a posição dele dentro da array. Pensei em por:

if (x == portas[i])

Mas não da, pq portas[i] está dentro do for, e o escopo da variável não funcionaria no outro método. Qual seria a melhor forma de resolver isso?

Rodrigo_Sasaki

Não, amigo. Você tem que implementar a classe de acordo com aquele "esqueleto" que te mandei.

No caso pra abrir as portas você faria assim.
public class Casa{

    Porta[] portas;

    public Casa(){
        portas = {new Porta(), new Porta(), new Porta()};
    }

    public void abrirPorta(int indice){
        portas[indice].abrirPorta();
    }

    public void fecharPorta(int indice){
        portas[indice].fecharPorta();
    }

}
Como a própria classe Porta tem a implementação de como abrir, você não precisa se preocupar com isso na classe Casa, entendeu?
gabrieltosi

Entendi, o problema é que eu estou com duvida e nem conseguindo criar o método abrePorta na classe Porta.

Rodrigo_Sasaki

Bom, vou te dar uma colher de chá porque parece que não está conseguindo mesmo, rs.. Vê se te ajuda a implementar o resto da classe.

O que define se uma porta está aberta ou não (seu estado), é o atributo aberta, portanto é ele que temos que manipular.
public class Porta {

    private boolean aberta;

    public void abrir(){
        this.aberta = true;
    }

}
Entendeu? Aí a partir disso aí você complementa com o que quiser que a classe tenha.
gabrieltosi
digaoneves:
Bom, vou te dar uma colher de chá porque parece que não está conseguindo mesmo, rs.. Vê se te ajuda a implementar o resto da classe. O que define se uma porta está aberta ou não (seu estado), é o atributo aberta, portanto é ele que temos que manipular.
public class Porta {

    private boolean aberta;

    public void abrir(){
        this.aberta = true;
    }

}
Entendeu? Aí a partir disso aí você complementa com o que quiser que a classe tenha.

Me desculpa, o erro foi meu, em não ter deixado explicito a minha duvida. Eu entendi esse código, e até já tinha feito isso no exercício anterior, o que estou quebrando a cabeça é pq agora eu tenho que:


Programa:
Classe: Casa Atributos: cor, totalDePortas, portas[] Métodos: void pinta(String s), int quantasPortasEstaoAbertas(),
void adicionaPorta(Porta p), int totalDePortas()
Crie uma casa, pinte-a. Crie três portas e coloque-as na casa através do método adicionaPorta, abra
e feche-as como desejar. Utilize o método quantasPortasEstaoAbertas para imprimir o número de portas
abertas e o método totalDePortas para imprimir o total de portas em sua casa.
Capítulo

E o meu problema está sendo em criar esses dois métodos: quantasPortasEstaoAbertas e totalDePortas, porque após criar uma porta eu vou por ela dentro de uma array. Só que no método abrePorta, eu tenho que abrir aquela porta especifica, para depois poder contar quantas portas estão abertas dentro da array correto?

To há dois dias para conseguir fazer esse exercício, quebrando a cabeça serio.

Rodrigo_Sasaki

então, para descobrir quantas portas tem abertas, você vai correr o seu array (independente do tamanho que tenha) e pra cada porta que estiver aberta, você incrementa um contador.public int quantasPortasEstaoAbertas(){ for(Porta p : portas){ //verifica se está aberta //incrementa o contador } //retorna o valor do contador } Era essa sua dúvida?

gabrieltosi

digaoneves:
então, para descobrir quantas portas tem abertas, você vai correr o seu array (independente do tamanho que tenha) e pra cada porta que estiver aberta, você incrementa um contador.public int quantasPortasEstaoAbertas(){ for(Porta p : portas){ //verifica se está aberta //incrementa o contador } //retorna o valor do contador } Era essa sua dúvida?

Mais ou menos, o que eu to tentando entender é o que eu ponho ali como condição do if? Para ele entender que somente UMA referencia dentro da array deve ser aberta, se a array tem 10 portas, eu quero abrir só a porta p1.

public void abrePorta(Portas x){ 
		
		for (int i = 0; i < portas.length; i++){
			
			if (x == /**a posição dele dentro do array*/){
				
				aberta = true;
				System.out.println("A porta " + x + " foi aberta");
		
			}
		}
		
	}//fim do metodo abrePorta
Rodrigo_Sasaki

Mas esse é outro método, cara.

Qual dos métodos você está com dúvida?

se o seu método abrePorta recebe um objeto Porta, é só você invocar o próprio método da porta, porém não vi nenhum método abrePorta ali no seu exercício. Você está fazendo isso porque quer? Seria algo assim:public void abrirPorta(Porta p){ p.abrir(); }

gabrieltosi

Eu to utilizando a Apostila da Caelum, no outro capitulo ele passa isso de OO e eu fiz essa mesma coisa, criei esse metodo abrePorta e fechaPorta. Agora os exercícios são sobre Arrays. Dessa vez eu tenho que criar porta, por dentro de um array, fechar e abrir essas portas, contar quantas estão abertas e depois dizer o total delas.

Só que para o método quantasPortasEstaoAbertas() funcionar, o metodo abrePorta() precisa estar funcionando.
Só que eu tenho que abrir porta e especificar qual porta dentro da Array portas está sendo aberta.

Algo como

Portas porta = new Portas();
porta.portas = new Portas [10];
		
Portas p1 = new Portas();
porta.adicionaPorta(p1); //adiciona a porta a Array
porta.abrePorta(p1); //aqui que eu estou com problema, pq nesse método eu não consigo dizer pro Java abrir a porta somente da 
                              //referência p1.
public void abrePorta(Portas x){ 
		
		for (int i = 0; i < portas.length; i++){
			
			if (x == /**a posição dele dentro do array*/){
				
				aberta = true;
				System.out.println("A porta " + x + " foi aberta");
		
			}
		}
		
	}//fim do metodo abrePorta

Meu método abrePorta() está assim, sem eu saber o que porta ali na condição if, pq não sei como me referir a posição do objeto que eu passar pelo paramêtro, no caso p1. Qual seria a posição de p1 na array portas???

Rodrigo_Sasaki
Você pode percorrer os índices perguntando quem é quem, ou pode abrir a porta pelo índice, eu acho mais fácil.
public void abrirPorta(Porta porta){
    for(int i=0 ; i<portas.length ; i++){
        if(portas[i].equals(porta){
            portas[i].abrir();
            System.out.println("A porta " + i + " foi aberta!");
            break;
        }
    }
}

public void abrirPorta(int i){
    portas[i].abrir();
    System.out.println("A porta " + i + " foi aberta!");
}
gabrieltosi
digaoneves:
Você pode percorrer os índices perguntando quem é quem, ou pode abrir a porta pelo índice, eu acho mais fácil.
public void abrirPorta(Porta porta){
    for(int i=0 ; i<portas.length ; i++){
        if(portas[i].equals(porta){
            portas[i].abrir();
            System.out.println("A porta " + i + " foi aberta!");
            break;
        }
    }
}

public void abrirPorta(int i){
    portas[i].abrir();
    System.out.println("A porta " + i + " foi aberta!");
}

Usei o primeiro exemplo, e deu: "Exception in thread "main" java.lang.NullPointerException"

Rodrigo_Sasaki

é porque você tem que instanciar o objeto antes. O seu método adicionarPorta, tem que verificar algum índice do array que esteja nulo, e instanciar uma porta nele.

Ex:public void adicionarPorta(Porta p){ for(int i=0 ; i<portas.length ; i++){ if(portas[i] == null){ portas[i] = p; } } } Último código pronto que te mando hein ^^

gabrieltosi

digaoneves:
é porque você tem que instanciar o objeto antes. O seu método adicionarPorta, tem que verificar algum índice do array que esteja nulo, e instanciar uma porta nele.

Ex:public void adicionarPorta(Porta p){ for(int i=0 ; i<portas.length ; i++){ if(portas[i] == null){ portas[i] = p; } } } Último código pronto que te mando hein ^^

Mas eu estanciei, meu adicionaPorta() está igualzinho ao seu. O método main está assim:

Portas porta = new Portas();
porta.portas = new Portas [10];

Portas p1 = new Portas();
porta.adicionaPorta(p1);
porta.abrePorta(p1);
Rodrigo_Sasaki

Se uma NullPointerException está sendo lançada, isso quer dizer que você está tentando acessar um método de alguma variável que está nula, poste a stackTrace completa do erro.

Mas eu só posso imaginar que o seu adicionarPorta não está instanciando, ou o seu abrirPorta não está batendo no índice certo.

Por isso que eu prefiro usar listas do que usar Array, mas como é um exercício, é interessante você quebrar a cabeça :slight_smile:

gabrieltosi

É só to insistindo mesmo porque é exercício e quero aprender, e não entendi muito bem essa parte de arrays.

O erro está assim:

Exception in thread main java.lang.NullPointerException

at caelum.Portas.abrePorta(Portas.java:42)

at caelum.CasaTeste.main(CasaTeste.java:12)
Rodrigo_Sasaki

peraí, cara, não é a Porta que tem que ter esse método, é a Casa. Você misturou 2 classes em 1 aí e a coisa perdeu o sentido.

gabrieltosi

SAASASUHSAHUASU to sentindo que eu to mais perdido do que cego em tiroteio.
Eu pus todos os métodos dentro da classe Porta, e to utilizando a classe Casa só como main.
Não é para fazer isso?

Rodrigo_Sasaki
public class Porta{

    private boolean aberta;

    public void abrir(){
        // Implementação
    }

    public void fechar(){
        // Implementação
    }

}

public class Casa{

    private Porta[] portas;

    public int quantidadePortasAbertas(){
        // Implementação
    }

    public void adicionarPorta(Porta porta){
        // Implementação
    }

    public void abrirPorta(Porta porta){
        // Implementação
    }

}

public class TesteCasa{

    public static void main(String[] args){
        // Implementação do seu teste
    }

}
Criado 25 de junho de 2012
Ultima resposta 26 de jun. de 2012
Respostas 30
Participantes 3