[Resolvido] Exercicio Caelum FJ-11 - Arrays

27 respostas
F

Oi pessoal! Estou com um problema aqui que não consegui resolver ainda, alguem pode me ajudar por favor ?

To resolvendo os exercicios da apostila FJ-11 da Caelum e to preso nesse problema sobre arrays:

...Cuidado ao preencher esse método: alguns índices do seu array podem não conter referência para um
Funcionario construído, isto é, ainda se referirem para null. Se preferir, use o for novo do java 5.0.
Aí, através do seu main, depois de adicionar alguns funcionários, basta fazer:
empresa.mostraEmpregados();
(opcional) Em vez de mostrar apenas o salário de cada funcionário, você pode chamar o método mostra()
de cada Funcionario da sua array.

Não consegui fazer esse método empresa.mostraEmpregados(); funcionar. Alguem sabe o motivo ?

public class TestaEmpresa {
	public static void main (String[] args){

		Empresa empresa = new Empresa();		
		
		empresa.empregados = new Funcionario[5];
		
		for (int i = 0; i < empresa.empregados.length; i++) {
			Funcionario f = new Funcionario(); 
			f.salario = 1000 + i * 100;
			
			//if temporario para testar o metodo contem
			if (i == 0)				
				f.rg="456456";
			else
				f.rg="777";
			
			empresa.adiciona(f);
			
		}

		// Como utilizo o metodo abaixo?
		empresa.contem(f);
		
	}
}
public class Empresa {
	String nome;
	String cnpj;
	String endereco;
	static int controlador = 0;
	
	Funcionario[] empregados;
	
	// o controlador será usado para guardar o índice livre mais proximo do vetor empregados
	void adiciona(Funcionario f){
		if (controlador < empregados.length){
			this.empregados[controlador] = f;
			controlador++;
		}
		else
			System.out.println("Array cheio.");
	}   
	
	
	void mostraEmpregados() {   
        for (int i=0; i<this.empregados.length; i++) {   
            System.out.println("Funcionario: "+this.empregados[i].rg);   
        }   
    }
		
	
	// Método para verificar se um determinado Funcionario se encontra ou não como
	// funcionário desta empresa:
	boolean contem(Funcionario f){
		boolean flag = false;
		
		for (int i=0; i<this.empregados.length; i++){
			if (this.empregados[i].rg == f.rg)
				flag = true;				
		}
		f.estaNaEmpresa = flag;
		return f.estaNaEmpresa;
	}              
     
}

27 Respostas

Rodrigo_Sasaki

ele gera algum erro? se sim poste aqui :wink:

leoviniga

Dá algum errou ou só não imprime?

Mudando um pouco o assunto…você poderia utilizar o atributo length do array em vez de criar uma variável estática “controlador” para adicionar o usuário ^^

F

Digao na verdade eu me expressei mal.

o que gostaria de fazer é o seguinte:

Quero fazer o método empresa.contem(f); funcionar. Não to conseguindo porque nem sequer compila. Ja passei a manha inteira tentando entender e não consegui ainda.

F

leoviniga:
Dá algum errou ou só não imprime?

Mudando um pouco o assunto…você poderia utilizar o atributo length do array em vez de criar uma variável estática “controlador” para adicionar o usuário ^^

Não usei o lenght porque o controlador será usado para guardar o índice livre mais proximo do vetor empregados. Ainda tenho que pensar como vou fazer isso…

Y

Você está criando o Funcionario f dentro do laço “for” e tentando usar ele fora do laço.

Rodrigo_Sasaki

o método ta meio confuso… se tudo o que você quer é saber se o funcionário está na empresa… não precisa alterar os atributos dele… achei isso estranho…
creio que o mais correto seria assim:

boolean contem(Funcionario f){   
        boolean flag = false;   
           
        for (int i=0; i<this.empregados.length; i++){   
            if (this.empregados[i].rg == f.rg)   
                flag = true;                   
        }   
        return flag;   
    }

se quiser imprimir uma mensagenzinha ou algo do tipo pode fazer assim, invoque o método. Se o retorno for true, imprima “funcionário na empresa” se false “funcionário não está na empresa” ou qualquer mensagem que você quiser hehe

Rodrigo_Sasaki

mesmo sendo um objeto instanciado dentro do for… ele está adicionando eles à lista que ele tem dentro da empresa… então a referência não é perdida.

leoviniga
if (this.empregados[i].rg == f.rg)

Se rg estiver como string (imagino que esteja) utilize o método equals para compara-los…
Mais info: http://www.guj.com.br/java/241198-resolvido-diferenca-entre-equals-e-

Imagino que o método contem deveria funcionar dessa maneira:

if (empresa.contem(f)){
       //código...
}
Y

mesmo sendo um objeto instanciado dentro do for… ele está adicionando eles à lista que ele tem dentro da empresa… então a referência não é perdida.

Até posso estar errado pois só olhei o código por cima, mas toda a vez que entra no laço cria uma instancia de Funcionario e adiciona na lista. Como saberia qual “f” é o que está passando como parâmetro? Confere aí…

leoviniga

mesmo sendo um objeto instanciado dentro do for… ele está adicionando eles à lista que ele tem dentro da empresa… então a referência não é perdida.

Até posso estar errado pois só olhei o código por cima, mas toda a vez que entra no laço cria uma instancia de Funcionario e adiciona na lista. Como saberia qual “f” é o que está passando como parâmetro? Confere aí…

for (int i = 0; i < empresa.empregados.length; i++) {  
            Funcionario f = new Funcionario();   
            f.salario = 1000 + i * 100;  
              
            //if temporario para testar o metodo contem  
            if (i == 0)               
                f.rg="456456";  
            else  
                f.rg="777";  
              
            empresa.adiciona(f);  
             
        }

// Como utilizo o metodo abaixo?  
        empresa.contem(f);

Realmente…nem tinha me tocado…você teria que chamar o método contem dentro do for, ou criar o Objeto antes do for…vai depender do que você quer

F

E como eu busco o funcionario cujo rg é 456456?

f.rg=“456456”;

Esse comando

if (this.empregados[i].rg == f.rg)

ficaria assim é isso: if (this.empregados[i].rg.equals(f.rg))

leoviniga

frostbyte:
E como eu busco o funcionario cujo rg é 456456?

f.rg=“456456”;

Esse comando

if (this.empregados[i].rg == f.rg)

ficaria assim é isso: if (this.empregados[i].rg.equals(f.rg))


Isso mesmo…o comando fica assim

O ideal seria você testar seus métodos assim:

Crie 3 Objetos funcionario…com valores distintos ou iguais você descide…
chame o método adicionar com 2 deles…
e chame o método contém com o outro…

Daí ponha algo tipo um System.out.println(“Está na empresa”) dentro do if (this.empregados[i].rg.equals(f.rg))

F

Agora meu código tá assim:

public class TestaEmpresa {
	public static void main (String[] args){
		Empresa empresa = new Empresa();		
		
		empresa.empregados = new Funcionario[5];
		
		for (int i = 0; i < empresa.empregados.length; i++) {
			Funcionario f = new Funcionario(); 
			f.salario = 1000 + i * 100;
			
			//if temporario para testar o metodo contem
			if (i == 0)				
				f.rg="456456";
			else
				f.rg="777";
			
			empresa.adiciona(f);
			
			
			if (empresa.contem(f)){
				System.out.println("contem funcionario");
			}
			
		}

		empresa.mostraEmpregados();
	}
}
public class Empresa {
	String nome;
	String cnpj;
	String endereco;
	static int controlador = 0;
	
	Funcionario[] empregados;
	
	
	void adiciona(Funcionario f){
		if (controlador < empregados.length){
			this.empregados[controlador] = f;
			controlador++;
		}
		else
			System.out.println("Array cheio.");
	}   
	
	
	void mostraEmpregados() {   
        for (int i=0; i<this.empregados.length; i++) {   
            System.out.println("Funcionario: "+this.empregados[i].rg);   
        }   
    }
	
	
	
	// Método para verificar se um determinado Funcionario se encontra ou não como
	// funcionário desta empresa:
	boolean contem(Funcionario f){
		boolean flag = false;
		
		for (int i=0; i<this.empregados.length; i++){
			if (this.empregados[i].rg.equals(f.rg)) // Não sei se esse codigo ta certo!
				flag = true;				
		}
		return flag;
	}              
     
}
Rodrigo_Sasaki

leoviniga:

for (int i = 0; i < empresa.empregados.length; i++) {  
            Funcionario f = new Funcionario();   
            f.salario = 1000 + i * 100;  
              
            //if temporario para testar o metodo contem  
            if (i == 0)               
                f.rg="456456";  
            else  
                f.rg="777";  
              
            empresa.adiciona(f);  
             
        }

// Como utilizo o metodo abaixo?  
        empresa.contem(f);

Realmente…nem tinha me tocado…você teria que chamar o método contem dentro do for, ou criar o Objeto antes do for…vai depender do que você quer

qual o problema com o contem(f) fora do for… sendo que a referência está dentro de empresa? não entendi…

ta resolvido seu problema frostbyte ?

F
<blockquote>Exception in thread “main” java.lang.NullPointerException

at Empresa.contem(Empresa.java:35)

at TestaEmpresa.main(TestaEmpresa.java:26)</blockquote>

Ainda nao ta resolvido. Pessoal, me desculpem se estou escrevendo besteiras. To cansado, passei o dia tentando resolver isso e acho que nem to pensando direito…
Obrigado aos amigos que estão me ajudando com toda a paciência do mundo.

eu gostaria de saber como faço pra fazer uma busca no vetor de empregados (empresa.empregados = new Funcionario[5];) pelo rg desse valor 456456 (f.rg="456456";)

Y

A referência de f é o Funcionario que só existe dentro do laço

leoviniga

Dá uma pesquisada sobre escopo de classe

kritiuns

Brow acho que falta vc instanciar seu array

Funcionario f[] = new Funcionario[tamanho];

–edit

ops desculpe não tinha visto a linha em q vc instancia o array no seu método main.

Rodrigo_Sasaki

ah … entendi… você ta falando da própria referencia de f que não existe mais… não que a referência do objeto não exista… saquei

desculpa ai :slight_smile:

kritiuns
public class TestaEmpresa {  
        public static void main (String[] args){  
      
            Empresa empresa = new Empresa();          
              
            empresa.empregados = new Funcionario[5];  
              
            for (int i = 0; i < empresa.empregados.length; i++) {  
                Funcionario f = new Funcionario();   
                f.salario = 1000 + i * 100;  
                  
                //if temporario para testar o metodo contem  
                if (i == 0)               
                    f.rg="456456";  
                else  
                    f.rg="777";  
                  
                empresa.adiciona(f);  
                  
            }  
      
            // Como utilizo o metodo abaixo?  
            
           //essa hora vc precisa ter um outro objeto de Funcionario instanciado para pesquisar ....tente assim
           Funcionario testeFunc = new Funcionario();
           testeFunc.setRg("12345")// ou testeFunc.rg = "12345";
           sysout(empresa.contem(testeFunc));  
              
        }  
    }
Rodrigo_Sasaki

tente deixar o contem assim:

boolean contem(Funcionario f){   
        boolean flag = false;   
           
        for (int i=0; i<this.controlador; i++){   
            if (this.empregados[i].rg.equals(f.rg)) // Não sei se esse codigo ta certo!   
                flag = true;                   
        }   
        return flag;   
    }

e acho que o controlador estático fica meio estranho… você pode ter problemas se tiver mais de uma empresa.

edit: se decidir que quer deixar o controlador como estático… remova o ‘this’ no controlador dentro do for…

leoviniga

frostbyte…
Você está utilizando alguma IDE para desenvolver suas aplicações?
Elas te ajudam a identificar e corrigir erros básicos como de escopo de classe e chamada de métodos que as vezes passam despercebidos…

Rodrigo_Sasaki

o problema é que quando ele está adicionando o f, ele logo depois chama o contem(), que corre o array todo pela sua propriedade length… que no caso é 5

então no momento ele está assim: array[f, null, null, null, null]

na hora em que ele testa o rg com o primeiro dado do array nenhum problema o corre… agora quando ele pergunta o rg do segundo dado que é um null… lança uma NullPointerException… por isso achei melhor ele usar o controlador… que quando adiciona 1 dado… vale 1… então testa o contem() em apenas um registro… e esse problema ja não ocorre mais

F
<blockquote>Exception in thread “main” java.lang.NullPointerException

at Empresa.contem(Empresa.java:35)

at TestaEmpresa.main(TestaEmpresa.java:26)</blockquote>

Continua dando esse erro.

frostbyte…
Você está utilizando alguma IDE para desenvolver suas aplicações?
Elas te ajudam a identificar e corrigir erros básicos como de escopo de classe e chamada de métodos que as vezes passam despercebidos…

Resposta: Eclipse

tente deixar o contem assim:

boolean contem(Funcionario f){     
    boolean flag = false;     
         
    for (int i=0; i<this.controlador; i++){     
        if (this.empregados[i].rg.equals(f.rg)) // Não sei se esse codigo ta certo!      
            flag = true;                     
    }     
    return flag;     
}

e acho que o controlador estático fica meio estranho… você pode ter problemas se tiver mais de uma empresa.

edit: se decidir que quer deixar o controlador como estático… remova o ‘this’ no controlador dentro do for…


Feito!

Funcionario testeFunc = new Funcionario(); testeFunc.setRg("12345")// ou testeFunc.rg = "12345"; sysout(empresa.contem(testeFunc));
Feitp

Rodrigo_Sasaki

eu acabei de testar aqui… removendo o static de controlador… e trocando o ‘empregados.length’ por ‘this.controlador’

e rodou certinho…

F

Resultado:

contem funcionario
contem funcionario
contem funcionario
contem funcionario
contem funcionario
Funcionario: 456456
Funcionario: 777
Funcionario: 777
Funcionario: 777
Funcionario: 777
true

Pessoal, muitissimo obrigado pela sua ajuda e paciência!
Vocês foram de muita ajuda!

Eu devo colocar as classes aqui ? Não sei como é a regra do fórum…

kritiuns

Só coloque como resolvido no assunto do seu primeiro post!

Abraços!

Criado 24 de maio de 2011
Ultima resposta 24 de mai. de 2011
Respostas 27
Participantes 5