[RESOLVIDO] Referencias em Array

[quote=Eiro]humm… entendi… agora tipo, como tem no enunciado da questão

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?
}

não dá pra fazer desse jeito então?[/quote]

Vamos lá:

1 - Empresa já tem o método adiciona !
2 - A referencia é um Funcionario como podemos ver !
3 - Quando é chamado o método adiciona, ele adiciona um funcionario no array de Funcionario[] empregado com a posição i que inicia com 0 e quando ele passa pelo
this.empregado[i] = f temos um incremento i++ que tornará a posição 0 em 1 para que possa ser adicionar mais um funcionario na posição 1 e assim consecutivamente
até que todos os funcionario sejam adicionados em suas respectivas posições até o limite definido por você (no meu caso foram 100 posições).

Deu para entender ?!

O código já está fazendo isso, tanto que se você quiser buscar um funcionario pela posição ele aparecerá sem problemas.

Flus

Isso eu já entendi, acho que vc não entendeu qual é minha dúvida…

Quero saber se dá para eu adicionar um array sem fazer aquelas referencias especificas (F[0] = new… F[1] = new…) sem fugir do que se pede no enunciado

Estou postando o codigo com sobrescrita de método, para que você possa entender.
E com isso você poderá usar os 2 tipos com parametros ou com objeto inteiro.

class Empresa {    
	String nome;    
	int cnpj;    
	int i = 0;    
	Funcionario[] empregado = new Funcionario[100];   

	// Tente entender essa chamada
	void adiciona(Funcionario f) {
		this.adiciona(f.nome, f.dep, f.salario); 
	}  
	
	// Sobrescrita do método
	void adiciona(String nome, String dep, double salario) {
		this.empregado[i] = new Funcionario(nome, dep, salario);  
		this.i++;
	}
	
	void recupera(){  
		System.out.println("Funcionarios cadastrados\n");  
		for (Funcionario fun : empregado) {  
			if(fun != null)  
				System.out.println(fun.nome);  
		}  
	}  
}

public class TestePrograma {  
	public static void main (String[] args){    
		Empresa e = new Empresa();    
		
		e.adiciona("AAAA", "TI", 7000);
		e.adiciona("BBBB", "ADM", 5000);
		e.adiciona("CCCC", "MKT", 700);
		e.adiciona("DDDD", "PRO", 5555);

		e.recupera();  
	}    
}

Flus.

  1. 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.
  2. 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:

hmmm!! pronto desse jeito que eu queria, nem sabia que podia desse jeito, mas pq nao fica duplicado?

e nessa resolução foge do que a questao ta pedindo?

Agora entendi o enunciado inteiro mas se você for ver não vai fugir muito do que já foi feito.

Tenta fazer aí que daqui a pouco envio o que eu fiz.

[quote=Eiro]hmmm!! pronto desse jeito que eu queria, nem sabia que podia desse jeito, mas pq nao fica duplicado?

e nessa resolução foge do que a questao ta pedindo?[/quote]

Como assim duplicado ?

Essa solução foge sim um pouco do que está pedindo.

Postando outra solução sem definir a quantidade de array na classe empresa. Seguindo o enunciado.

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

    void adiciona(Funcionario f){  
        this.empregados[i] = f;  
        this.i++;  
    }
	
	void recupera(){  
		System.out.println("Funcionarios cadastrados\n");  
		for (Funcionario fun : empregados) {  
			if(fun != null)  
				System.out.println("Nome: " + fun.nome +" Depto: " + fun.dep + " Salário: US$" + fun.salario);  
		}  
	}  
}

public class TestePrograma {  
	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("FFF", "DBA", 8500);
		
		for (int i = 0; i < e.empregados.length; i++) {
			e.adiciona(e.empregados[i]);
		}
		e.recupera();  
	}

essa parte aqui tem 2 metodo adiciona

[code]void adiciona(Funcionario f) {
this.adiciona(f.nome, f.dep, f.salario);
}

// Sobrescrita do método  
void adiciona(String nome, String dep, double salario) {  
    this.empregado[i] = new Funcionario(nome, dep, salario);    
    this.i++;  
}  [/code]

Entendi,

Bom ele não duplica por que quando você chama o método:

void adiciona(Funcionario f) { // Nesse ponto ele chama o método com parametros passando nome, dep e salario this.adiciona(f.nome, f.dep, f.salario); }

Logo você estará executando o método:

void adiciona(String nome, String dep, double salario) {    
        this.empregado[i] = new Funcionario(nome, dep, salario);      
        this.i++;    
    } 

Em qualquer uma das situações. E como eu estou sobrescrevendo o método logo eu posso executar tanto um quanto o outro que não terá problemas.
Você vai começar a entender melhor quando for ver sobre Sobrescrita de métodos.
Entendeu ?!

Flus

hummm… tendi!

Valeu fera! ajudou muito!

Abraço!

Voltei de novo!

Ainda nessa questão, tem uma opcional que não ta dando certo:

  1. (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.

meu código(o funcionario não mudou nada)

[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;
    	}
    }
}    

} [/code]

[code]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

up

up

[code]public void contem(Funcionario f){
for (int i = 0; i < empregados.length; i++) {
if(empregados[i]!=null)
if(empregados[i].nome.equals( f.nome)){
System.out.println(“empregado existe”);
break;
}else{
System.out.println(“empregado não existe”);
break;
}
}

}[/code]

Você não menciona, mas estou subentendendo que exista um atributo String nome em Funcionario.

[quote=AndreLuisOnLine][code]public void contem(Funcionario f){
for (int i = 0; i < empregados.length; i++) {
if(empregados[i]!=null)
if(empregados[i].nome.equals( f.nome)){
System.out.println(“empregado existe”);
break;
}else{
System.out.println(“empregado não existe”);
break;
}
}

}[/code]

Você não menciona, mas estou subentendendo que exista um atributo String nome em Funcionario.[/quote]

Nesse caso vai funcionar se somente o nome for o mesmo caso o nome seja o mesmo e o salario e dept sejam diferentes irá retornar que o funcionario trabalha pois a comparação é somente do nome. Se você tiver certeza absoluta que outro funcionario não terá o mesmo nome isso daria certo, no entanto, em uma empresa creio que seria
difícil esse cenário.

Conselho para que você tenha plena certeza de que todo seu objeto é igual ao outro sobrescreva o método .equals() na classe Funcionario com isso dará certo com certeza.

Caso não queira ter tanto trabalho de procurar o eclipse faz isso para você, mas creio que o melhor é entender.

Flws.

Para que não haja confusão de tópicos, vamos nos concentrar somente no tópico abaixo.

http://www.guj.com.br/java/274309-duvida-em-exercicios-de-array

Com se tratam do mesmo tema melhor nos referenciarmos por esse ok!

Para que não haja confusão, no titulo desse tópico deixe dessa forma ‘’ [RESOLVIDO] Referencias em Array ‘’ e assim poderemos dar continuidade, do tema no outro ok.

Flws.