Realocação de arrays[RESOLVIDO]

Olá galera. Estou fazendo um exercício da apostila da Caelum e estou com um problema em relação a realocação de arrays. O exercício é este:
6) 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.
Meu código está assim:
Classes Data e Funcionário

[code]public class Data {
int dia;
int mes;
int ano;
}

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

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

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

void mostra() {
	System.out.println("Nome: " + nome);
	System.out.println("Departamento: " + departamento);
	System.out.println("Salário: " + salario);
	System.out.println("Dia: " + this.dataDeEntrada.dia);
	System.out.println("Mês: " + this.dataDeEntrada.mes);
	System.out.println("Ano: " + this.dataDeEntrada.ano);
	System.out.println("RG: " + RG);
	System.out.println("Está na empresa? " + estaNaEmpresa);
}

}
[/code]

Classe Empresa

[code]
public class Empresa {

String nome;
String cnpj;
String endereco;
Funcionario[] funcionarios = new Funcionario[10];


void adiciona(Funcionario f) {
	for (int i = 0; i < this.funcionarios.length; i++) {
		if (this.funcionarios[i] == null) {
			this.funcionarios[i] = f;
			return;
		}
	}	
	Funcionario[] funcionarios2 = new Funcionario[20];
	for (int i = 0; i < this.funcionarios.length; i++) {
		funcionarios2[i] = funcionarios[i];
		
	}	
	for (int i = this.funcionarios.length; i < funcionarios2.length; i++) {		 
		if (funcionarios2[i] == null) {
			funcionarios2[i] = f;
		}	
	}
	System.out.println(funcionarios2[12].nome);  // -> [b]AQUI ESTA O GRANDE X DA QUESTÃO[/b]
}	



boolean contem(Funcionario f) {
	for (int i = 0; i < funcionarios.length; i++) {
		this.funcionarios[i] = f;
		if (this.funcionarios[i] != null) {
				System.out.println("O funcionario " + this.funcionarios[i].nome + " está na empresa");
				this.funcionarios[i].estaNaEmpresa = true;

// break;
}
else {
if(this.funcionarios[i] == null) {
System.out.println(“Este não está na empresa”);
this.funcionarios[i].estaNaEmpresa = false;
break;
}
}
}
return false;
}
}[/code]

Classe Principal

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

	Empresa empresa = new Empresa();
	
	Funcionario f1 = new Funcionario();
	f1.salario = 1000;
	f1.nome = "Paulo";
	empresa.adiciona(f1);
	
	Funcionario f2 = new Funcionario();
	f2.salario = 2000;
	f2.nome = "Carlos";
	empresa.adiciona(f2);
	
	Funcionario f3 = new Funcionario();
	f3.salario = 3000;
	f3.nome = "Maria";
	empresa.adiciona(f3);
	
	Funcionario f4 = new Funcionario();
	f4.salario = 4000;
	f4.nome = "Jéssica";
	empresa.adiciona(f4);
	
	Funcionario f5 = new Funcionario();
	f5.salario = 5000;
	f5.nome = "Teotônio";
	empresa.adiciona(f5);
	
	Funcionario f6 = new Funcionario();
	f6.salario = 6000;
	f6.nome = "Flávia";
	empresa.adiciona(f6);
	
	Funcionario f7 = new Funcionario();
	f7.salario = 7000;
	f7.nome = "Isaac";
	empresa.adiciona(f7);
	
	Funcionario f8 = new Funcionario();
	f8.salario = 7000;
	f8.nome = "Luciano";
	empresa.adiciona(f8);

	Funcionario f9 = new Funcionario();
	f9.salario = 7000;
	f9.nome = "Aurélio";
	empresa.adiciona(f9);

	Funcionario f10 = new Funcionario();
	f10.salario = 10000;
	f10.nome = "Fábio";
	empresa.adiciona(f10);

	Funcionario f11 = new Funcionario();
	f11.salario = 11000;
	f11.nome = "Geraldo";
	empresa.adiciona(f11);

	Funcionario f12 = new Funcionario();
	f12.salario = 12000;
	f12.nome = "Farias";
	empresa.adiciona(f12);
	
	Funcionario f13 = new Funcionario();
	f13.salario = 13000;
	f13.nome = "Vargas";
	empresa.adiciona(f13);
	
	Funcionario f14 = new Funcionario();
	f14.salario = 14000;
	f14.nome = "Lucas";
	empresa.adiciona(f14);
	
	Funcionario f15 = new Funcionario();
	f15.salario = 15000;
	f15.nome = "Felipe";
	empresa.adiciona(f15);
}

}[/code]

Então quando eu vou compliar, aparece os ultimos 5 nomes sendo q eu queria q aparecesse só um, pois coloquei System.out.println(funcionarios2[12].nome), o q deveria aparecer apenas o décimo terceiro nome, mas aparece os últimos 5… E gostaria se possivel q avisassem outros erros deste código. Desde já muito obrigado!!!

Oi,

Eu acho que seu metodo adiciona da classe Empresa ta meio estranho.

acho que tem alguma lógica errada ai.

:?

Exatamente cara, é isso que eu to tentando descobrir aqui como arrumá-la. Mas não sei onde estou errando. É algum erro simples de resolver mas aí é que esta o grande x da questão. Mais alguem aii pessoal???

Oi, tenta algo assim…

           public class Vetor {

                      private Aluno[] alunos = new Aluno[100];
                      private int totalDeAlunos = 0;
                      ...
                      
                      private void garantaEspaco() {
                             
                                if (this.totalDeAlunos == this.alunos.length) {
                                              Aluno[] novaArray = new Aluno[this.alunos.length * 2];
                                              
                                              for (int i = 0; i < this.alunos.length; i++) {
                                                         novaArray[i] = this.alunos[i];
                                              }
                                              
                                              this.alunos = novaArray;
                                }
                        }
}

tirado da apostila da caelum cs14

Me pareçe que esse outro array que vc cria dentro do metodo só vai durar enquanto durar o metodo.
então como no codigo acima vc deve dar a referencia do seu array funcionarios um array maior.

algo assim.

espero q tenha ajudado.

Para realocar os funcionários você precisa seguir estes passos:

Ao adicionar um Funcionário:

-Se o array atual ainda tem capacidade disponível para alocar o funcionário
–caso não haja outros funcionários
—coloque-o na primeira posição;
–caso contrário
—depois do ultimo funcionário colocado lá.

-Se o array atual não tiver mais lugares disponíveis
–crie um novo array com uma capacidade maior que o array atual;
–copie todos os funcionários do array atual para o novo;
–coloque o funcionário depois do último funcionário;
–coloque o array novo no lugar do array atual.

É uma boa idéia é guardar a posição da próxima inserção na lista, para poder inserir rapidamente.

Galera, obrigado pela ajuda aí… consegui resolver vendo outro post daqui do fórum de outro colega q tinha duvida neste mesmo exercício… Minhas classes agora estão assim:

Classe Empresa

[code]
public class Empresa {

String nome;
String cnpj;
String endereco;
Funcionario[] funcionarios = new Funcionario[10];


void adiciona (Funcionario f) {
	for (int i = 0; i < this.funcionarios.length; i++) {
		if (this.funcionarios[i] == null) {
			this.funcionarios[i] = f;
			return;
		}
	}
	
	//realoca se não achou posição pra ele
	Funcionario[] temp = new Funcionario[this.funcionarios.length * 2];
	for (int i = 0; i < this.funcionarios.length; i++) {
		temp[i] = funcionarios[i];
	}
	this.funcionarios = temp;
	
// manda adicionar depois de realocado
	this.adiciona(f);
}

boolean contem(Funcionario f) {
	boolean situacao = false;
	for (int i = 0; i < funcionarios.length; i++) {
		if (this.funcionarios[i] == f) {
			System.out.println("O funcionario " + this.funcionarios[i].nome + " está na empresa");
			funcionarios[i].estaNaEmpresa = true;
			situacao = funcionarios[i].estaNaEmpresa;
		}
	}
	return situacao;
}

}[/code]

Classe main

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

	Empresa empresa = new Empresa();
	
	Funcionario f1 = new Funcionario();
	f1.salario = 1000;
	f1.nome = "Paulo";
	empresa.adiciona(f1);
	
	Funcionario f2 = new Funcionario();
	f2.salario = 2000;
	f2.nome = "Carlos";
	empresa.adiciona(f2);
	
	Funcionario f3 = new Funcionario();
	f3.salario = 3000;
	f3.nome = "Maria";
	empresa.adiciona(f3);
	
	Funcionario f4 = new Funcionario();
	f4.salario = 4000;
	f4.nome = "Jéssica";
	empresa.adiciona(f4);
	
	Funcionario f5 = new Funcionario();
	f5.salario = 5000;
	f5.nome = "Teotônio";
	empresa.adiciona(f5);
	
	Funcionario f6 = new Funcionario();
	f6.salario = 6000;
	f6.nome = "Flávia";
	empresa.adiciona(f6);
	
	Funcionario f7 = new Funcionario();
	f7.salario = 7000;
	f7.nome = "Isaac";
	empresa.adiciona(f7);
	
	Funcionario f8 = new Funcionario();
	f8.salario = 7000;
	f8.nome = "Luciano";
	empresa.adiciona(f8);

	Funcionario f9 = new Funcionario();
	f9.salario = 7000;
	f9.nome = "Aurélio";
	empresa.adiciona(f9);

	Funcionario f10 = new Funcionario();
	f10.salario = 10000;
	f10.nome = "Fábio";
	empresa.adiciona(f10);

	Funcionario f11 = new Funcionario();
	f11.salario = 11000;
	f11.nome = "Geraldo";
	empresa.adiciona(f11);

	Funcionario f12 = new Funcionario();
	f12.salario = 12000;
	f12.nome = "Farias";
	empresa.adiciona(f12);
	
	Funcionario f13 = new Funcionario();
	f13.salario = 13000;
	f13.nome = "Vargas";
	empresa.adiciona(f13);
	
	Funcionario f14 = new Funcionario();
	f14.salario = 14000;
	f14.nome = "Lucas";
	empresa.adiciona(f14);
	
	Funcionario f15 = new Funcionario();
	f15.salario = 15000;
	f15.nome = "Felipe";
	empresa.adiciona(f15);
	
	empresa.contem(f8); // Se este funcionário estiver adicionado, é porque ele está contido na empresa
	
}

}[/code]

Prontinho, quem precisar é só testar… Abraços

Bom, por motivos de interpretação, o meu ficou um pouco diferente. Nada crucial mas com base no projeto que já vinha sendo desenvolvido nos capítulos anteriores, cheguei a esse código:

[code]public class Empresa {

String nome;
String cnpj;
Funcionario[] empregados = new Funcionario[10];

void adiciona(Funcionario f){

        for(int i=0; i < this.empregados.length; i++){
            if (this.empregados[i] == null){
                this.empregados[i] = f;
                return;
            }
        }

// realocação caso a lista esteja cheia
Funcionario[] temp = new Funcionario[this.empregados.length*2];
for(int i=0; i < this.empregados.length; i++){
temp[i] = this.empregados[i];
}
this.empregados = temp;
this.adiciona(f);
}

void info(){

    for(int i = 0; i < this.empregados.length; i++){
        if(this.empregados[i] != null){
        System.out.println("Funcionário na posição: " +i) ;
        System.out.println(this.empregados[i].salario);
        if(this.empregados[i].estaNaEmpresa == true){
        System.out.println("Funcionário trabalha aqui!");}
        //Para mostrar todas as informações do Funcionário
        //this.empregados[i].mostra();
        }
        
    }

}

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

    }
    return situacao;
}

}[/code]

e o Main:

[code]public class TestaEmpresa {

public static void main(String[] args){

    Empresa empresa = new Empresa();

    for(int i = 0; i < 12; i++){
        Funcionario f = new Funcionario();
        f.salario = 1000+100*i;
        f.estaNaEmpresa = true;
        empresa.adiciona(f);

    }

    empresa.info();
}

}
[/code]

Abraços!