Ajuda em exercicio 5.6 pag:67 caelum[RESOLVIDO]

17 respostas
F

Boa Tarde pessoal!
Gostariam que me ajudassem no seguinte exercicio, pois não estou entendendo muito bem ele.

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.

Estou com duvida nessa parte, essa realocação seria jogar os mesmos valores so que para outro endereço? como faria no Java?

Desde ja agradeço as explicações, Obrigado!

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

	void adiciona(Funcionario f){
		if(this.empregados[this.cont] == null){
			this.empregados[this.cont] = f;
			this.cont++;
		}
		else {
		    System.out.println("Ja há funcionario cadastardo nessa posicao!");
		}
	}

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

	void mostraEmpregados(){
		for(Funcionario x : empregados){
			x.mostra(); //System.out.println(x.salario);
		}
	}
}

class Funcionario {
	String nome;
	String departamento;
	double salario;
	Data dataDeEntrada;
	String rg;
	boolean estaNaEmpresa;

	void bonifica(double qtde) {
		double novoSalario = this.salario + qtde;
		this.salario = novoSalario;
	}

	void demite() {
		if( this.estaNaEmpresa == true) {
			this.estaNaEmpresa = false;
		}
	}

	void readimite() {
		if(this.estaNaEmpresa == false) {
			this.estaNaEmpresa = true;
		}
	}

	void descontos() {
		double descontoInss = this.salario * 0.08;
		double descontoTransporte = this.salario * 0.06;
		this.salario -= (descontoInss + descontoTransporte);
	}

	void mostra() {
		System.out.println("Registro de funcionario:\nNome: "+this.nome+"\nDepartamento: "+this.departamento+"\nSalario: "+this.salario+"\nData Admissao: "+this.dataDeEntrada.dia+"/"+this.dataDeEntrada.mes+"/"+this.dataDeEntrada.ano+"\nRG: "+this.rg+"\nEsta na Empresa: "+this.estaNaEmpresa+"\n");
	}
		
}

class Data {
	int dia;
	int mes;
	int ano;
}


class TesteFuncionario {
	public static void main(String[] args) {
		Funcionario cadFun = new Funcionario();
		Data data = new Data();
		Empresa empresa = new Empresa();

		empresa.empregados = new Funcionario[10];

		for(int i=0;i < 10;i++){
			Funcionario r = new Funcionario();
			r.nome = "Funcionario "+ i +".";
			r.departamento = "Suporte "+ i +".";
			r.dataDeEntrada = data;
			r.rg = "12. "+ i +".";
			r.estaNaEmpresa = true;
			r.salario = 1000 + i * 100;
			empresa.adiciona(r);
		}
		empresa.mostraEmpregados();

	}
}

17 Respostas

HelberChoo
Para resolver isso as tuas variáveis devem deixar de ser finais, recomendo a colocar as classes em ficheiros separados, fica mais bonito!...
//Coloca este código na função adicionar localizada na classe Empresa

//Verificar se a lista esta cheia
        boolean estacheio = true; //Inicia considerando que esteja cheia
        for(int i=0; i<this.empregados.length; i++){
            if(this.empregados[i] == null) estacheio = false; //Caso encontre um bloco vazio, deixa de estar cheia
        }

        if(estacheio){//Se estiver cheia entra 
            Funcionario[] copia = new Funcionario[this.empregados.length]; //Cria um array para conter os dados dos funcionarios
            System.arraycopy(this.empregados, 0, copia, 0, this.empregados.length); //Copia todos dados para esse array
            this.empregados.length = new Funcionario[copia.length+1]; //Aumenta uma unidade nos funcionarios
            System.arraycopy(copia, 0, this.empregados, 0, copia.length); //Devolve os dados dos funcionarios no array principal
        }
Espero ter ajudado!... :D
F
HelberChoo:
Para resolver isso as tuas variáveis devem deixar de ser finais, recomendo a colocar as classes em ficheiros separados, fica mais bonito!...
//Coloca este código na função adicionar localizada na classe Empresa

//Verificar se a lista esta cheia
        boolean estacheio = true; //Inicia considerando que esteja cheia
        for(int i=0; i<this.empregados.length; i++){
            if(this.empregados[i] == null) estacheio = false; //Caso encontre um bloco vazio, deixa de estar cheia
        }

        if(estacheio){//Se estiver cheia entra 
            Funcionario[] copia = new Funcionario[this.empregados.length]; //Cria um array para conter os dados dos funcionarios
            System.arraycopy(this.empregados, 0, copia, 0, this.empregados.length); //Copia todos dados para esse array
            this.empregados.length = new Funcionario[copia.length+1]; //Aumenta uma unidade nos funcionarios
            System.arraycopy(copia, 0, this.empregados, 0, copia.length); //Devolve os dados dos funcionarios no array principal
        }
Espero ter ajudado!... :D

Entendi o que voce fez.. porem como estou iniciando em java não tem como fazer isso sem utilizar essa funçaõ do arraycopy, só para saber como se faz e fixar o conhecimento?

Obrigado

lucasportela

Leia isto:

https://sites.google.com/site/lucasportela/home/java/eliminarreferenciaobsoletadoobjeto

Cuidado para não gerar um “memory leak”

F
fabioigor:
HelberChoo:
Para resolver isso as tuas variáveis devem deixar de ser finais, recomendo a colocar as classes em ficheiros separados, fica mais bonito!...
//Coloca este código na função adicionar localizada na classe Empresa

//Verificar se a lista esta cheia
        boolean estacheio = true; //Inicia considerando que esteja cheia
        for(int i=0; i<this.empregados.length; i++){
            if(this.empregados[i] == null) estacheio = false; //Caso encontre um bloco vazio, deixa de estar cheia
        }

        if(estacheio){//Se estiver cheia entra 
            Funcionario[] copia = new Funcionario[this.empregados.length]; //Cria um array para conter os dados dos funcionarios
            System.arraycopy(this.empregados, 0, copia, 0, this.empregados.length); //Copia todos dados para esse array
            this.empregados.length = new Funcionario[copia.length+1]; //Aumenta uma unidade nos funcionarios
            System.arraycopy(copia, 0, this.empregados, 0, copia.length); //Devolve os dados dos funcionarios no array principal
        }
Espero ter ajudado!... :D

Entendi o que voce fez.. porem como estou iniciando em java não tem como fazer isso sem utilizar essa funçaõ do arraycopy, só para saber como se faz e fixar o conhecimento?

Obrigado

Obrigado Lucas pelo artigo... agora to começando a entender, isso seria como uma alocação dinamica de memoria correto? caso o usuário deseje adicionar mais porem esteja cheio, o vetor é autmaticamente aumentado de acordo com o que o usuário necessita? Na facul vi sobre isso porem na linguagem C hehe
agora poderia so me explicar ou me indicar onde olho o funcionamento do System.arraycopy? Obrigado

lucasportela

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29

HelberChoo
Okey!... :D
//Coloca este código na função adicionar localizada na classe Empresa  
  
//Verificar se a lista esta cheia  
        boolean estacheio = true; //Inicia considerando que esteja cheia  
        for(int i=0; i<this.empregados.length; i++){  
            if(this.empregados[i] == null) estacheio = false; //Caso encontre um bloco vazio, deixa de estar cheia  
        }  
  
        if(estacheio){//Se estiver cheia entra   
            Funcionario[] copia = new Funcionario[this.empregados.length]; //Cria um array para conter os dados dos funcionarios  
            for(int i=0; i< this.empregados.length; i++){ //Copia todos dados para esse array  
                copia[i]=this.empregados[i];
             }
            this.empregados.length = new Funcionario[copia.length+1]; //Aumenta uma unidade nos funcionarios  
            for(int i=0; i< copia.length; i++){ //Devolve os dados dos funcionarios no array principal  
                this.empregados[i]=copia[i];
            }
        }
F
HelberChoo:
Okey!... :D
//Coloca este código na função adicionar localizada na classe Empresa  
  
//Verificar se a lista esta cheia  
        boolean estacheio = true; //Inicia considerando que esteja cheia  
        for(int i=0; i<this.empregados.length; i++){  
            if(this.empregados[i] == null) estacheio = false; //Caso encontre um bloco vazio, deixa de estar cheia  
        }  
  
        if(estacheio){//Se estiver cheia entra   
            Funcionario[] copia = new Funcionario[this.empregados.length]; //Cria um array para conter os dados dos funcionarios  
            for(int i=0; i< this.empregados.length; i++){ //Copia todos dados para esse array  
                copia[i]=this.empregados[i];
             }
            this.empregados.length = new Funcionario[copia.length+1]; //Aumenta uma unidade nos funcionarios  
            for(int i=0; i< copia.length; i++){ //Devolve os dados dos funcionarios no array principal  
                this.empregados[i]=copia[i];
            }
        }

ocorreu este erro ao adicior o código no metodo adiciona:

C:\Fabio Java>javac TesteFuncionario.java
TesteFuncionario.java:28: cannot assign a value to final variable length
this.empregados.length = new Funcionario[copia.length
1];
^
TesteFuncionario.java:28: incompatible types
found : Funcionario[]
required: int
this.empregados.length = new Funcionario[copia.length
1];
^
2 errors

void adiciona(Funcionario f){
		boolean estacheio = true;
		
		if(this.empregados[this.cont] == null){
			this.empregados[this.cont] = f;
			this.cont++;
		}
		else {
		    System.out.println("Ja há funcionario cadastardo nessa posicao!");
		}

		for(int i=0; i<this.empregados.length; i++) {
			if(this.empregados[i] == null) {
				estacheio = false;
			}
		}
		if(estacheio) {
			Funcionario[] copia = new Funcionario[this.empregados.length];
			for(int i=0; i < this.empregados.length; i++) {
				copia[i]=this.empregados[i];
			}
			this.empregados.length = new Funcionario[copia.length + 1];
			for(int i=0;i < copia.length; i++){
				this.empregados[i] = copia[i];
			}
		}		
	}
F

Ajuda na duvida aew galera…
nada ainda? O que devo fazer para solucionar o erro galera?
Obrigado
t+

F

Galera, pesquisei no Forum mas nao achei nada a respeito deste problema. Alguem pode ajudar ai?

flws
t+

lucasportela

Uai, já não estava resolvido? Você leu os artigos que indiquei?

F
lucasportela:
Uai, já não estava resolvido? Você leu os artigos que indiquei?

Li, sim e alterei meu codigo, verifica se meu racicionio está certo e se é deste modo que devo fazer?
Pois quando adicionei um mais que o vetor podia suportar ocorreu este erro:

C:\Fabio Java>java TesteFuncionario
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at Empresa.garanteCapacidade(TesteFuncionario.java:26)
at Empresa.adiciona(TesteFuncionario.java:8)
at TesteFuncionario.main(TesteFuncionario.java:110)

valews
t+

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

	void adiciona(Funcionario f){
			garanteCapacidade();
			this.empregados[this.cont] = f;
			this.cont++;		
	}
	
	void garanteCapacidade() {
		boolean estacheio = true;
		
		for(int i=0; i<this.empregados.length; i++) {
			if(this.empregados[i] == null) {
				estacheio = false;
			}
		}
		if(estacheio) {
			Funcionario[] empregados_antigos = this.empregados;
			
			this.empregados = new Funcionario[2 * this.empregados.length + 1];
			
			System.arraycopy(empregados_antigos,0,this.empregados,0,this.empregados.length);
			
		}
	}
>
F

Ajuda aew pessoal?
o que fiz de errado que não estou entendendo? o que faço para consertar o erro?
desde ja agradeço
Obrigado

lucasportela
private void garanteCapacidade(){
               if(empregados.length == tamanho) {
                       Funcionario[] empregadosAntigos = empregados;
                       empregados= new Funcionario[2 * empregados.length + 1];
                       System.arraycopy(empregadosAntigos, 0, empregados, 0, tamanho);
               }
       }
F

Valews Lucas, porem realizei o o Teste aqui e o ocorreu o erro:
[i]Exception in thread "main" java.lang.NullPointerException
at Empresa.mostraEmpregados(TesteFuncionario.java:36
at TesteFuncionario.main(TesteFuncionario.java:103)[i]

Está ai o código para verificar. Notem que meu no for coloquei < 11 justamente para cadastrar um a mais para ver se função garante capacidade
está ok, porem está ocorrendo o erro acima. O que há de errado? Obrigado

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

	void adiciona(Funcionario f){
			garanteCapacidade();
			this.empregados[this.cont] = f;
			this.cont++;		
	}
	
	void garanteCapacidade(){
		if(empregados.length == cont){
			Funcionario[] empregadosAntigos = empregados;
			empregados = new Funcionario[2 * empregados.length + 1];
			System.arraycopy(empregadosAntigos, 0, empregados, 0, cont);
		}
	}
	

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

	void mostraEmpregados(){
		for(Funcionario x : empregados){
			x.mostra(); //System.out.println(x.salario);
		}
	}
}

class TesteFuncionario {
	public static void main(String[] args) {
		Funcionario cadFun = new Funcionario();
		Data data = new Data();
		Empresa empresa = new Empresa();

		empresa.empregados = new Funcionario[10];

		for(int i=0;i < 11;i++){
			Funcionario r = new Funcionario();
			r.nome = "Funcionario "+ i +".";
			r.departamento = "Suporte "+ i +".";
			r.dataDeEntrada = data;
			r.rg = "12. "+ i +".";
			r.estaNaEmpresa = true;
			r.salario = 1000 + i * 100;
			empresa.adiciona(r);
		}
		empresa.mostraEmpregados();
        }
}
F

E aew galera, oq ue eu fiz de errado?
ajudem ai
Obrigado
t+

F

nada pessoal?
help me aew… por que está ocorrendo o erro? e como conserto?
Obrigado

HelberChoo

Meu amigo o erro ai é que estas a tentar colocar um array no local de memoria reservado para um inteiro

this.empregados.length = new Funcionario[copia.length + 1];

O devias fazer é

this.empregados = new Funcionario[copia.length + 1];

Sorry foi uma falha quando te passei o código(Só para ver se estavas atento)

Criado 16 de agosto de 2011
Ultima resposta 20 de ago. de 2011
Respostas 17
Participantes 3