Realocação de arrays[RESOLVIDO]

6 respostas
K

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

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);
	}
}
Classe Empresa
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;
	}
}

Classe Principal

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

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!!!

6 Respostas

Filipe_A

Oi,

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

acho que tem alguma lógica errada ai.

:?

K

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

Filipe_A

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.

B

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íveiscrie 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.

K

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

Classe main

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

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

Silviorp

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:

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

}
e o Main:
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();
    }

}

Abraços!

Criado 4 de setembro de 2009
Ultima resposta 20 de abr. de 2010
Respostas 6
Participantes 4