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!