[RESOLVIDO] Referencias em Array

35 respostas
E

Gente, estou quebrando a cabeça nesse exercicio, help plz

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

Postarei meu codigo abaixo(uma idéia, pq ele ta errado)

35 Respostas

E
public class Funcionario {
	String nome;
	String dep;
	double salario;
	Empresa empregado;
	
	public Funcionario(String name, String dept, double sal)
	{
		this.nome = name;
		this.dep = dept;
		this.salario = sal;		
	}

}
public class Empresa {
	String nome;
	int cnpj;
	Funcionario[] empregado;
	int i = 0;
	
	void adiciona(Funcionario f){
		this.empregado[i] = f;
		i++;
	}
}
public class Programa {
	public static void main (String[] args){
		Empresa e = new Empresa();
		Funcionario[] f;
		
		e.adiciona("Leandro","TI",2000);
	}

}
S

Seu método adiciona está pedindo como parâmetro um objeto do tipo funcionário e ao chama-lo no main você está passando parâmetros diferentes (2 String e 1 Inteiro).
Imagino que seu método adiciona esteja correto, nele você está guardando sempre a ultima posição livre na variavel i.
Para funcionar você deve primeiro instanciar seu array de Funcionario (Se quiser pode fazer isso no construtor) e passar o parâmetro correto no método main.

E

Instanciar assim?

Funcionario[] f = new Funcionario[];

eu coloquei e deu erro

Variable must provide either dimension expressions or an array initializer

S

Quando você vai instanciar um array você deve determinar o tamanho do mesmo.

Ex.: Funcionario f = new Funcionario[10];

Neste meu array eu poderei ter até 10 instancias de funcionários.

E

a linha e.adiciona continua com erro

S

Cole novamente o codigo completo para eu verificar como ficou apos suas alterações.
Você realizou as alterações dos parâmetros passados pro método adiciona dentro do Main que eu tinha comentado ?
Bom, coloque o código novamente aqui que ficará mais facil identificar os problemas.

Abraço

E
public class Funcionario {
	String nome;
	String dep;
	double salario;
	Empresa empregado;
	
	public Funcionario(String name, String dept, double sal)
	{
		this.nome = name;
		this.dep = dept;
		this.salario = sal;		
	}

}
public class Empresa {
	String nome;
	int cnpj;
	Funcionario[] empregado;
	int i = 0;
	
	void adiciona(Funcionario f){
		this.empregado[i] = f;
		i++;
	}
}
public class Programa {
	public static void main (String[] args){
		Empresa e = new Empresa();
		Funcionario[] f = new Funcionario[10];
                e.empregado = f;
		
		e.adiciona("Leandro","TI",2000);
	}

}
CyberX
class Funcionario {  
    String nome;  
    String dep;  
    double salario;  
    Empresa empregado;  
      
    public Funcionario(String name, String dept, double sal)  
    {  
        this.nome = name;  
        this.dep = dept;  
        this.salario = sal;       
    }  
  
}

class Empresa {  
    String nome;  
    int cnpj;  
    int i = 1;  
    Funcionario[] empregado;  
      
   void adiciona(Funcionario f){
	   empregado = new Funcionario[i];
	   // Alterando a posição do array de 1 para 0.
	   this.empregado[i-1] = f;
	   System.out.println("Empregado " + empregado[i-1].nome+" add com sucesso!");
	   this.i++;
    }  
}  
public class TestePrograma {
	public static void main (String[] args){  
        Empresa e = new Empresa();  
        Funcionario[] f = new Funcionario[3];  
        f[0] = new Funcionario("Leandro","TI",2000);
        f[1] = new Funcionario("Le","TI",500);
        f[2] = new Funcionario("Leon","ADM",20);
        
        for (Funcionario funcionario : f) {
        	e.adiciona(funcionario);  
		}
    }  
}

Acho que é isso (meio bizarro), essa maneira funciona para executar o método adiciona mas se você quiser recuperar algum funcionario depois creio que não conseguirá o melhor seria definir um tamanho default para o seu array de Funcionarios aí dessa forma você consegue recuperar mas creio que usar List fica muito mais elegante.
Se quiser de uma olhada docs.oracle.com/javase/6/docs/api/java/util/List.html

Flus.

CyberX

Dessa forma abaixo você conseguira recuperar o funcionario sem problemas.


class Funcionario {  
	String nome;  
	String dep;  
	double salario;  
	Empresa empregado;  

	public Funcionario(String name, String dept, double sal) {  
		this.nome = name;  
		this.dep = dept;  
		this.salario = sal;       
	}
}

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

	void adiciona(Funcionario f) {
		this.empregado[i] = f;
		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();  
		Funcionario[] f = new Funcionario[100];  
		f[0] = new Funcionario("Leandro","TI",2000);
		f[1] = new Funcionario("AAAA","DEV",500);
		f[2] = new Funcionario("BBBB","ADM",20);
		f[3] = new Funcionario("CCCC","NEC",210);

		for (Funcionario funcionario : f) {
			e.adiciona(funcionario);  
		}

		e.recupera();
	}  
}
E

Deu erro aqui

Exception in thread main java.lang.NullPointerException

at Empresa.adiciona(Empresa.java:9)

at Programa.main(Programa.java:11)
CyberX

Tem certeza ?

posta seu código aí.

E

Sim.

public class Empresa {
	String nome;
	int cnpj;
	Funcionario[] empregado;
	int i = 1;
	
	void adiciona(Funcionario f){
		this.empregado[i] = f;
		System.out.println("Empregado " + empregado[i].nome+" add com sucesso!"); 
		this.i++;
	}
}

public class Programa {
	public static void main (String[] args){
		Empresa e = new Empresa();
		Funcionario[] f = new Funcionario[10];
		f[0] = new Funcionario("Leandro", "TI", 4000);
		f[1] = new Funcionario("Leandro2", "DBA", 5000);
		f[2] = new Funcionario("Leandro3", "Suporte", 1000);
		
		for (Funcionario funcionario : f) {  
            e.adiciona(funcionario);    
        }  
	}

}
E

eu dei uma procurada o que era esse erro, diz que é pq o array não foi inicializado, mas eu num to inicializando não?!

E
Eiro:
Sim.
public class Empresa {
	String nome;
	int cnpj;
	Funcionario[] empregado;
	int i = 1;
	
	void adiciona(Funcionario f){
		this.empregado[i] = f;
		System.out.println("Empregado " + empregado[i].nome+" add com sucesso!"); 
		this.i++;
	}
}

public class Programa {
	public static void main (String[] args){
		Empresa e = new Empresa();
		Funcionario[] f = new Funcionario[10];
		f[0] = new Funcionario("Leandro", "TI", 4000);
		f[1] = new Funcionario("Leandro2", "DBA", 5000);
		f[2] = new Funcionario("Leandro3", "Suporte", 1000);
		
		for (Funcionario funcionario : f) {  
            e.adiciona(funcionario);    
        }  
	}

}

Eu não to entendendo muito bem não.. se já tá colocando os atributos na array pq ta dando esse for se já está adicionado?!

CyberX
Eiro:
Sim.
public class Empresa {
	String nome;
	int cnpj;
	Funcionario[] empregado;
	int i = 1;
	
	void adiciona(Funcionario f){
		this.empregado[i] = f;
		System.out.println("Empregado " + empregado[i].nome+" add com sucesso!"); 
		this.i++;
	}
}

public class Programa {
	public static void main (String[] args){
		Empresa e = new Empresa();
		Funcionario[] f = new Funcionario[10];
		f[0] = new Funcionario("Leandro", "TI", 4000);
		f[1] = new Funcionario("Leandro2", "DBA", 5000);
		f[2] = new Funcionario("Leandro3", "Suporte", 1000);
		
		for (Funcionario funcionario : f) {  
            e.adiciona(funcionario);    
        }  
	}

}

Você não está inicializando ele.

Dica: Você deve inicializar todos os arrays para que as posições possam ser utilizadas.
Presta a atenção no seu codigo e se preferir, compara com o que eu passei e verá que está faltando algo !

Flus.

E

Ah sim, faltou uma coisa no metodo Adiciona… heheh =P

Então, ainda tenho algumas duvidas, além da dúvida anterior, se não tem como eu fazer com que se adicione uma linha no array sem eu especificar ela…

Por exemplo: vc fez f[1] = new… f[2] = new… f[3] = new…

ao inves deu fazer isso acima, não da pra eu fazer um simples mestodo tipo;

e.adiciona(“atributos”);

e vai implementando como uma pilha?

E

eu add oq tava faltando e deu esse erro agora

Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 1

at Empresa.adiciona(Empresa.java:10)

at Programa.main(Programa.java:11)
CyberX

Vamos lá:

Olhe para seu método adiciona(Funcionario f){…}

void adiciona(Funcionario f){...}

Esse método espera que você passe como parametro um objeto do tipo Funcionario correto ?

então por esse motivo você deve informar um funcionario.

Agora se você quer passar outros parametros você pode sobrescrever o método fazendo:

void adiciona(String name, String dept, double sal){
// Aqui você implementa seu codigo de acordo que imaginar.
}

Você pode fazer da maneira que quiser mas lembre que a implementação dentro do adiciona() mudará um pouco.
Understood ?

Se precisar de + dicas é só falar. Flus.

E

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?

CyberX

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?

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

E

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

CyberX

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.

E
  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:
E

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?

CyberX

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.

CyberX

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?

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();  
	}
E

essa parte aqui tem 2 metodo adiciona

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++;  
    }
CyberX

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

E

hummm… tendi!

Valeu fera! ajudou muito!

Abraço!

E

Voltei de novo!

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

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.

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

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]);
        
    }      
}

Quando eu dou "Play" ela imprime assim:

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

E

up

E

up

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

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

CyberX
AndreLuisOnLine:
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;
                        }
		}
		
	}

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

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.

CyberX

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.

Criado 25 de maio de 2012
Ultima resposta 31 de mai. de 2012
Respostas 35
Participantes 4