Dúvida em exercícios de Array [RESOLVIDO]

Caros colegas,

Minha dúvida é a partir do exercício 05:

  1. Volte ao nosso sistema de Funcionario e crie uma classe Empresa dentro do mesmo arquivo .java. A
    Empresa tem um nome, cnpj e uma referência a uma array de Funcionario, além de outros atributos que
    você julgar necessário.

class Empresa { // outros atributos Funcionario[] empregados; String cnpj; }
2) A Empresa deve ter um método adiciona, que recebe uma referência a Funcionario como argumento, e
guarda esse funcionário. Algo como:

void adiciona(Funcionario f) { // algo tipo: // this.empregados[ ??? ] = f; // mas que posição colocar? }

Você deve inserir o Funcionario em uma posição da array que esteja livre. Existem várias maneiras para
você fazer isso: guardar um contador para indicar qual a próxima posição vazia ou procurar por uma posição
vazia toda vez. O que seria mais interessante?
É importante reparar que o método adiciona não recebe nome, rg, salário, etc. Essa seria uma maneira nem
um pouco estruturada, muito menos orientada a objetos de se trabalhar. Você antes cria um Funcionario e
já passa a referência dele, que dentro do objeto possui rg, salário, etc.

  1. Crie uma classe TestaEmpresa que possuirá um método main. Dentro dele crie algumas instâncias de
    Funcionario e passe para a empresa pelo método adiciona. Repare que antes você vai precisar criar a
    array, pois inicialmente o atributo empregados da classe Empresa não referencia lugar nenhum (null):

Empresa empresa = new Empresa(); empresa.empregados = new Funcionario[10];
Ou você pode construir a array dentro da própria declaração da classe Empresa, fazendo com que toda vez
que uma Empresa é instanciada, a array de Funcionario que ela necessita também é criada.
Crie alguns funcionários e passe como argumento para o adiciona da empresa:

Funcionario f1 = new Funcionario(); f1.salario = 1000; empresa.adiciona(f1); Funcionario f2 = new Funcionario(); f2.salario = 1700; empresa.adiciona(f2);

Você pode criar esses funcionários dentro de um loop, e dar valores diferentes de salários:

for (int i = 0; i < 5; i++) { Funcionario f = new Funcionario(); f.salario = 1000 + i * 100; empresa.adiciona(f); }
Repare que temos de instanciar Funcionario dentro do laço. Se a instanciação de Funcionario ficasse acima
do laço, estaríamos adicionado cinco vezes a mesma instância de Funcionario nesta Empresa, e mudando
seu salário a cada iteração, que nesse caso não é o efeito desejado.
Opcional: o método adiciona pode gerar uma mensagem de erro indicando quando o array já está cheio.

  1. Percorra o atributo empregados da sua instância da Empresa e imprima os salários de todos seus funcionários.
    Para fazer isso, você pode criar um método chamado mostraEmpregados dentro da classe Empresa:

void mostraEmpregados() { for (int i = 0; i < this.empregados.length; i++) { System.out.println("Funcionário na posição: " + i); // preencher para mostrar o salário!! } }
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.

5) (Opcional) Crie um método para verificar se um determinado Funcionario se encontra ou não como
funcionário desta empresa:

boolean contem(Funcionario f) {

// …
}
Você vai precisar fazer um for na sua array e verificar se a referência passada como argumento se encontra
dentro da array. Evite ao máximo usar números hard-coded, isto é, use o .length.

6) (Opcional) Caso a array já esteja cheia no momento de adicionar um outro funcionário, criar uma nova maior
e copiar os valores. Isto é, fazer a realocação já que java não tem isso: uma array nasce e morre com o
mesmo length.

Segue meu código no post abaixo:

[code]class Empresa {
String nome;
int cnpj;
int i = 0;
Funcionario[] empregados;

boolean contem(Funcionario f){  
    for (int i = 0; i < this.empregados.length; i++) {  
        if (f == empregados[i]){  
            System.out.println("Funcionario já trabalha nesta empresa");  
            return true;  
        }  
    }  
    System.out.println("O Funcionário não trabalha conosco");  
    return false;  
}  

void adiciona(Funcionario f){     
    if (i > 10){  
        System.out.println("Cheio");  
    }  
    else{  
    this.empregados[i] = f;      
    this.i++;    
    }  
}    
    
void mostra(){      
    System.out.println("Funcionarios cadastrados\n");      
    for (int i = 0; i < this.empregados.length; i++) {  
        if (empregados[i] != null){  
        System.out.println("Funcionário na posição: " + i);  
        System.out.println("Nome: " + empregados[i].nome  +" Depto: " + empregados[i].dep + " Salário: RS$" + empregados[i].salario);      
        }  
        else{  
            break;  
        }  
    }  
}      

}

public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
e.empregados = new Funcionario[10];
e.empregados[0] = new Funcionario(“AAA”, “TI”, 8000);
e.empregados[1] = new Funcionario(“BBB”, “ADM”, 6000);
e.empregados[2] = new Funcionario(“CCC”, “MKT”, 3500);
e.empregados[3] = new Funcionario(“DDD”, “TI”, 4500);
e.empregados[4] = new Funcionario(“EEE”, “DBA”, 8500);

    for (int i = 0; i < e.empregados.length; i++) {    
        e.adiciona(e.empregados[i]);    
    }   
    e.empregados[5] = new Funcionario("FFF", "DEV", 2500);    
    e.contem(e.empregados[1]);  
    e.contem(e.empregados[5]);  
    e.contem(e.empregados[7]);  
      
}        

} [/code]

Quando eu dou “Play” ela imprime assim:

Funcionario já trabalha nesta empresa
Funcionario já trabalha nesta empresa
Funcionario já trabalha nesta empresa

Imprime isso com toda razão ne amigo,

pra que aquele for ?

pense comigo antes do for voce ja adicionou os funcionarios no array diretamente, ai voce faz um laço para adicionar no array de empregrados da empresa os mesmo empregados que ja estao no array, algo sem logica, erro de principiante, depois voce adiciona mais e chama os metodos contem para ele verifica se os funcionarios que vc passou para ja estao dentro do array de empregados mas vc pega os funcionarios do proprio array, claro que vai dar aquele resposta voce precisa estuda muito mais, erros desse tipo eu diria que sao inaceitaveis olha o codigo que eu fiz e compara com o seu


package com.urbainski.testespringbatch;
class Funcionario
{

    String nome;
    String funcao;
    int salario;
    
    public Funcionario(String nome, String funcao, int salario)
    {
        this.funcao = funcao;
        this.nome = nome;
        this.salario = salario;
    }
    
}

class Empresa {          
    String nome;          
    int cnpj;          
    int i = 0;          
    Funcionario[] empregados;       
        
    boolean contem(Funcionario f){    
        for (int i = 0; i &lt; this.empregados.length; i++) {    
            if (f == empregados[i]){    
                System.out.println(&quot;Funcionario já trabalha nesta empresa&quot;);    
                return true;    
            }    
        }    
        System.out.println(&quot;O Funcionário não trabalha conosco&quot;);    
        return false;    
    }    
      
    void adiciona(Funcionario f){       
        if (i &gt; 10){    
            System.out.println(&quot;Cheio&quot;);    
        }    
        else{    
        this.empregados[i] = f;        
        this.i++;      
        }    
    }      
          
    void mostra(){        
        System.out.println(&quot;Funcionarios cadastrados\n&quot;);        
        for (int i = 0; i &lt; this.empregados.length; i++) {    
            if (empregados[i] != null){    
            System.out.println(&quot;Funcionário na posição: &quot; + i);    
            System.out.println(&quot;Nome: &quot; + empregados[i].nome  +&quot; Depto: &quot; + empregados[i].funcao + &quot; Salário: RS$&quot; + empregados[i].salario);        
            }    
            else{    
                break;    
            }    
        }    
    }        
}      
  
public class TesteCristian {        
    public static void main (String[] args){          
        Empresa e = new Empresa();          
        e.empregados = new Funcionario[10];   
        
        String[] nome = {&quot;aaa&quot;, &quot;bbb&quot;, &quot;ccc&quot;, &quot;ddd&quot;,&quot;eee&quot;};
        String[] func = {&quot;ti&quot;, &quot;adm&quot;, &quot;mkt&quot;, &quot;ti&quot;,&quot;dba&quot;};
        int[] salario = {8000,2000,1500,2600,3000};
              
        for (int i = 0; i &lt; nome.length; i++) {    
            Funcionario f = new Funcionario(nome[i], func[i], salario[i]);
            e.adiciona(f);      
        }     

        Funcionario f = new Funcionario(&quot;FFF&quot;, &quot;DEV&quot;, 2500);      
        e.contem(e.empregados[1]);    
        e.contem(f);    
        e.contem(e.empregados[7]);    
            
    }          
}

Olá Eiro, o problema de seu código é que o funcionário já está na empresa e só depois você testa se ele existe. O código: e.empregados[5] = new Funcionario("FFF", "DEV", 2500); adiciona o funcionário a empresa mesmo sem chamar o método adicionar. O que eu quero dizer é que quando esse código é executado você está dizendo: “Pegue meu objeto empresa, o array de empregados na posição 5 iguale ao funcionário instanciado”. Quando você verifica sé a empresa contém o empregado, a resposta vai ser verdadeira já que referência dele está no array de empregados da empresa verificada.

Espero ter ajudado.

[quote=CristianPalmaSola10]Imprime isso com toda razão ne amigo,

pra que aquele for ?

pense comigo antes do for voce ja adicionou os funcionarios no array diretamente, ai voce faz um laço para adicionar no array de empregrados da empresa os mesmo empregados que ja estao no array, algo sem logica, erro de principiante, depois voce adiciona mais e chama os metodos contem para ele verifica se os funcionarios que vc passou para ja estao dentro do array de empregados mas vc pega os funcionarios do proprio array, claro que vai dar aquele resposta voce precisa estuda muito mais, erros desse tipo eu diria que sao inaceitaveis olha o codigo que eu fiz e compara com o seu

[code]

package com.urbainski.testespringbatch;
class Funcionario
{

String nome;
String funcao;
int salario;

public Funcionario(String nome, String funcao, int salario)
{
    this.funcao = funcao;
    this.nome = nome;
    this.salario = salario;
}

}

class Empresa {
String nome;
int cnpj;
int i = 0;
Funcionario[] empregados;

boolean contem(Funcionario f){    
    for (int i = 0; i &lt; this.empregados.length; i++) {    
        if (f == empregados[i]){    
            System.out.println(&quot;Funcionario já trabalha nesta empresa&quot;);    
            return true;    
        }    
    }    
    System.out.println(&quot;O Funcionário não trabalha conosco&quot;);    
    return false;    
}    
  
void adiciona(Funcionario f){       
    if (i &gt; 10){    
        System.out.println(&quot;Cheio&quot;);    
    }    
    else{    
    this.empregados[i] = f;        
    this.i++;      
    }    
}      
      
void mostra(){        
    System.out.println(&quot;Funcionarios cadastrados\n&quot;);        
    for (int i = 0; i &lt; this.empregados.length; i++) {    
        if (empregados[i] != null){    
        System.out.println(&quot;Funcionário na posição: &quot; + i);    
        System.out.println(&quot;Nome: &quot; + empregados[i].nome  +&quot; Depto: &quot; + empregados[i].funcao + &quot; Salário: RS$&quot; + empregados[i].salario);        
        }    
        else{    
            break;    
        }    
    }    
}        

}

public class TesteCristian {
public static void main (String[] args){
Empresa e = new Empresa();
e.empregados = new Funcionario[10];

    String[] nome = {&quot;aaa&quot;, &quot;bbb&quot;, &quot;ccc&quot;, &quot;ddd&quot;,&quot;eee&quot;};
    String[] func = {&quot;ti&quot;, &quot;adm&quot;, &quot;mkt&quot;, &quot;ti&quot;,&quot;dba&quot;};
    int[] salario = {8000,2000,1500,2600,3000};
          
    for (int i = 0; i &lt; nome.length; i++) {    
        Funcionario f = new Funcionario(nome[i], func[i], salario[i]);
        e.adiciona(f);      
    }     

    Funcionario f = new Funcionario(&quot;FFF&quot;, &quot;DEV&quot;, 2500);      
    e.contem(e.empregados[1]);    
    e.contem(f);    
    e.contem(e.empregados[7]);    
        
}          

}
[/code][/quote]

Olá Amigo,

Eu também não entendi, numa postagem anterior um outro colega nosso me orientou a fazer isso, quanto ao seu codigo, perfeito, era isso que eu queria no e.adiciona, entretanto tem um porém, ele imprimiu que o funcionario na posição 7 do array trabalha conosco, porem ele não existe

[quote=eric.sl]Olá Eiro, o problema de seu código é que o funcionário já está na empresa e só depois você testa se ele existe. O código: e.empregados[5] = new Funcionario("FFF", "DEV", 2500); adiciona o funcionário a empresa mesmo sem chamar o método adicionar. O que eu quero dizer é que quando esse código é executado você está dizendo: “Pegue meu objeto empresa, o array de empregados na posição 5 iguale ao funcionário instanciado”. Quando você verifica sé a empresa contém o empregado, a resposta vai ser verdadeira já que referência dele está no array de empregados da empresa verificada.

Espero ter ajudado.[/quote]

Mas o funcionário da posição 7 não foi adicionado e ele diz que existe alguém ali

[quote=Eiro][quote=CristianPalmaSola10]Imprime isso com toda razão ne amigo,

pra que aquele for ?

pense comigo antes do for voce ja adicionou os funcionarios no array diretamente, ai voce faz um laço para adicionar no array de empregrados da empresa os mesmo empregados que ja estao no array, algo sem logica, erro de principiante, depois voce adiciona mais e chama os metodos contem para ele verifica se os funcionarios que vc passou para ja estao dentro do array de empregados mas vc pega os funcionarios do proprio array, claro que vai dar aquele resposta voce precisa estuda muito mais, erros desse tipo eu diria que sao inaceitaveis olha o codigo que eu fiz e compara com o seu

[code]

package com.urbainski.testespringbatch;
class Funcionario
{

String nome;
String funcao;
int salario;

public Funcionario(String nome, String funcao, int salario)
{
    this.funcao = funcao;
    this.nome = nome;
    this.salario = salario;
}

}

class Empresa {
String nome;
int cnpj;
int i = 0;
Funcionario[] empregados;

boolean contem(Funcionario f){    
    for (int i = 0; i &lt; this.empregados.length; i++) {    
        if (f == empregados[i]){    
            System.out.println(&quot;Funcionario já trabalha nesta empresa&quot;);    
            return true;    
        }    
    }    
    System.out.println(&quot;O Funcionário não trabalha conosco&quot;);    
    return false;    
}    
  
void adiciona(Funcionario f){       
    if (i &gt; 10){    
        System.out.println(&quot;Cheio&quot;);    
    }    
    else{    
    this.empregados[i] = f;        
    this.i++;      
    }    
}      
      
void mostra(){        
    System.out.println(&quot;Funcionarios cadastrados\n&quot;);        
    for (int i = 0; i &lt; this.empregados.length; i++) {    
        if (empregados[i] != null){    
        System.out.println(&quot;Funcionário na posição: &quot; + i);    
        System.out.println(&quot;Nome: &quot; + empregados[i].nome  +&quot; Depto: &quot; + empregados[i].funcao + &quot; Salário: RS$&quot; + empregados[i].salario);        
        }    
        else{    
            break;    
        }    
    }    
}        

}

public class TesteCristian {
public static void main (String[] args){
Empresa e = new Empresa();
e.empregados = new Funcionario[10];

    String[] nome = {&quot;aaa&quot;, &quot;bbb&quot;, &quot;ccc&quot;, &quot;ddd&quot;,&quot;eee&quot;};
    String[] func = {&quot;ti&quot;, &quot;adm&quot;, &quot;mkt&quot;, &quot;ti&quot;,&quot;dba&quot;};
    int[] salario = {8000,2000,1500,2600,3000};
          
    for (int i = 0; i &lt; nome.length; i++) {    
        Funcionario f = new Funcionario(nome[i], func[i], salario[i]);
        e.adiciona(f);      
    }     

    Funcionario f = new Funcionario(&quot;FFF&quot;, &quot;DEV&quot;, 2500);      
    e.contem(e.empregados[1]);    
    e.contem(f);    
    e.contem(e.empregados[7]);    
        
}          

}
[/code][/quote]

Olá Amigo,

Eu também não entendi, numa postagem anterior um outro colega nosso me orientou a fazer isso, quanto ao seu codigo, perfeito, era isso que eu queria no e.adiciona, entretanto tem um porém, ele imprimiu que o funcionario na posição 7 do array trabalha conosco, porem ele não existe[/quote]

Olha só, outro erro;

igualei o array da posição 1 e ele diz que não existe;

Funcionario g = new Funcionario("bbb", "adm", 2000); e.contem(g);

Imprime = O Funcionário não trabalha conosco

Acho que tem algo errado com meu método contem

Se você quer comparar conteúdo do objeto use:

if(f.equals(empregados[i])){...}

Nesse caso ele irá comparar se o conteúdo do objeto f é o mesmo de empregados[i] no seu caso agora você irá receber uma NullPointerException na posição 7 OK

Flw.

[quote][code]
Olha só, outro erro;

igualei o array da posição 1 e ele diz que não existe;

view plaincopy to clipboardprint?

Funcionario g = new Funcionario("bbb", "adm", 2000);  
e.contem(g);  

Imprime = O Funcionário não trabalha conosco

Acho que tem algo errado com meu método contem
[/code][/quote]

Realmente não trabalha pois como você está comparando posição do objeto por == quando você dá um new ele cria uma nova posição do objeto e por esse motivo não estpa na mesma posição do array.

Portanto quando quiser comparar conteúdo utilize .equals() …

Para conhecimento use o == para tipos primitivos (int, double, float, char, byte, long) que não tem problemas e para classes (String, Funcionario, Empresa) utilize o método .equals()

[quote=CyberX]Se você quer comparar conteúdo do objeto use:

if(f.equals(empregados[i])){...}

Nesse caso ele irá comparar se o conteúdo do objeto f é o mesmo de empregados[i] no seu caso agora você irá receber uma NullPointerException na posição 7 OK

Flw.[/quote]

Tudo bem receber esse erro do NullPointer, pq antes aparecia que o funcionario trabalhava…
Bom, com o equals resolveu o problema da posição 7, entretanto, ainda diz que o funcionario g não trabalha

boolean contem(Funcionario f){ for (int i = 0; i &lt; this.empregados.length; i++) { if (f.equals(empregados[i])){ System.out.println(&quot;Funcionario já trabalha nesta empresa&quot;); return true; } } System.out.println(&quot;O Funcionário não trabalha conosco&quot;); return false; }

e como que faz para ao inves de dar o erro do NullPointer… mostrar um println que ele não trabalha?

Isso é uma questão de lógica. Analise comigo:

Você sabe que o Objeto do tipo Funcionario pode vir null então crie uma condição if que avalie se o funcionario é null, se sim imprima sua mensagem se não continua fazendo o que tem que fazer, creio que isso seja o suficiente para seu caso.

Com relação ao caso de o funcionario g não trabalha aconselho você a entender um pouco sobre sobrescrita do método .equals() creio que isso possa te ajudar.

Flws

humm, entendi, dei uma pesquisada, está dando errado pq não está se referenciando ao mesmo objeto…

[code]boolean contem(Funcionario f){
for (int i = 0; i <= this.empregados.length; i++) {
if (this.empregados[i] != null){
if ( (f.nome.equals(this.empregados[i].nome)) && (f.dep.equals(this.empregados[i].dep)) && (f.salario == this.empregados[i].salario)){
System.out.println(“Funcionario “+f.nome+” já trabalha nesta empresa”);
return true;
}
}
else{
System.out.println(“O Funcionário “+f.nome+” não trabalha conosco”);
return false;
}

	}
	System.out.println("O Funcionário "+f.nome+" não trabalha conosco");
	return false;
}[/code]

[code]public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
e.empregados = new Funcionario[10];

    String[] nome = {"aaa", "bbb", "ccc", "ddd","eee"};  
    String[] func = {"ti", "adm", "mkt", "ti","dba"};  
    double[] salario = {8000,2000,1500,2600,3000};  
    
    for (int i = 0; i < nome.length; i++) {      
        Funcionario f = new Funcionario(nome[i], func[i], salario[i]);  
        e.adiciona(f);        
    }       
    
    Funcionario f = new Funcionario("FFF", "DEV", 2500);  
    Funcionario g = new Funcionario("bbb", "adm", 2000);
    e.contem(e.empregados[2]);      
    e.contem(f);      
    e.contem(g);
  
    e.mostra();
}      

} [/code]

Pronto, deu certo! consegui! só ainda não consegui o contem do array 7 mostrar dar um println ao inves de dar erro no program

[code]boolean contem(Funcionario f){
if (f == null){
return false;
}
for (int i = 0; i <= this.empregados.length; i++) {
if (this.empregados[i] != null){
if ( (f.nome.equals(this.empregados[i].nome)) && (f.dep.equals(this.empregados[i].dep)) && (f.salario == this.empregados[i].salario)){
System.out.println(“Funcionario “+f.nome+” já trabalha nesta empresa”);
return true;
}
}
else{
System.out.println(“O Funcionário “+f.nome+” não trabalha conosco”);
return false;
}
}

	System.out.println("O Funcionário "+f.nome+" não trabalha conosco");
	return false;
}

[/code]

Resolvido =p

Ficou POG ou é isso mesmo?

Na verdade você conseguiu o resultado que queria mas para ficar Orientado a Objetos o melhor seria sobrescrever o método equals() na classe Funcionario dessa forma:

	// Sobrescrevendo o método .equals()
	@Override
	public boolean equals(Object obj) {
// IF avalia se o obj é instancia de Funcionario
		if(obj instanceof Funcionario) {
			final Funcionario outroFunc = (Funcionario) obj;
			
			// Comparando se todos os dados são iguais ignorando case para nome e função
			if(this.nome.equalsIgnoreCase(outroFunc.nome) 
					&& this.funcao.equalsIgnoreCase(outroFunc.funcao) 
						&& this.salario == outroFunc.salario) {
				return true;
			}
		}
		return false;
	}

Dessa forma você não precisa comparar todas as vezes da forma que você fez.

E seu método contem não seria alterado.

	boolean contem(Funcionario f) {
		if(f != null){
			for (int i = 0; i &lt; this.empregados.length; i++) {      
                        // Método equals foi sobrescrito na classe Funcionario e o objeto Funcionario pode ser comparado por completo.
                       // Sem  a necessidade de sempre comparar todos os parametros todas as vezes que precisar efetivar alguma comparação.
				if (f.equals(empregados[i])){      
					System.out.println(&quot;Funcionario já trabalha nesta empresa&quot;);      
					return true;      
				}      
			}
		}
		System.out.println(&quot;O Funcionário não trabalha conosco&quot;);      
		return false;      
	}

Dessa forma fica mais orientado ok.

Flws.