Oi pessoal! Estou com um problema aqui que não consegui resolver ainda, alguem pode me ajudar por favor ?
To resolvendo os exercicios da apostila FJ-11 da Caelum e to preso nesse problema sobre arrays:
...Cuidado ao preencher esse método: alguns índices do seu array podem não conter referência para um
Funcionario construído, isto é, ainda se referirem para null. Se preferir, use o for novo do java 5.0.
Aí, através do seu main, depois de adicionar alguns funcionários, basta fazer:
empresa.mostraEmpregados();
(opcional) Em vez de mostrar apenas o salário de cada funcionário, você pode chamar o método mostra()
de cada Funcionario da sua array.
Não consegui fazer esse método empresa.mostraEmpregados(); funcionar. Alguem sabe o motivo ?
publicclassTestaEmpresa{publicstaticvoidmain(String[]args){Empresaempresa=newEmpresa();empresa.empregados=newFuncionario[5];for(inti=0;i<empresa.empregados.length;i++){Funcionariof=newFuncionario();f.salario=1000+i*100;//if temporario para testar o metodo contemif(i==0)f.rg="456456";elsef.rg="777";empresa.adiciona(f);}// Como utilizo o metodo abaixo?empresa.contem(f);}}
publicclassEmpresa{Stringnome;Stringcnpj;Stringendereco;staticintcontrolador=0;Funcionario[]empregados;// o controlador será usado para guardar o índice livre mais proximo do vetor empregadosvoidadiciona(Funcionariof){if(controlador<empregados.length){this.empregados[controlador]=f;controlador++;}elseSystem.out.println("Array cheio.");}voidmostraEmpregados(){for(inti=0;i<this.empregados.length;i++){System.out.println("Funcionario: "+this.empregados[i].rg);}}// Método para verificar se um determinado Funcionario se encontra ou não como// funcionário desta empresa:booleancontem(Funcionariof){booleanflag=false;for(inti=0;i<this.empregados.length;i++){if(this.empregados[i].rg==f.rg)flag=true;}f.estaNaEmpresa=flag;returnf.estaNaEmpresa;}}
Mudando um pouco o assunto…você poderia utilizar o atributo length do array em vez de criar uma variável estática “controlador” para adicionar o usuário ^^
F
frostbyte
Digao na verdade eu me expressei mal.
o que gostaria de fazer é o seguinte:
Quero fazer o método empresa.contem(f); funcionar. Não to conseguindo porque nem sequer compila. Ja passei a manha inteira tentando entender e não consegui ainda.
F
frostbyte
leoviniga:
Dá algum errou ou só não imprime?
Mudando um pouco o assunto…você poderia utilizar o atributo length do array em vez de criar uma variável estática “controlador” para adicionar o usuário ^^
Não usei o lenght porque o controlador será usado para guardar o índice livre mais proximo do vetor empregados. Ainda tenho que pensar como vou fazer isso…
Y
yuri_ev
Você está criando o Funcionario f dentro do laço “for” e tentando usar ele fora do laço.
Rodrigo_Sasaki
o método ta meio confuso… se tudo o que você quer é saber se o funcionário está na empresa… não precisa alterar os atributos dele… achei isso estranho…
creio que o mais correto seria assim:
se quiser imprimir uma mensagenzinha ou algo do tipo pode fazer assim, invoque o método. Se o retorno for true, imprima “funcionário na empresa” se false “funcionário não está na empresa” ou qualquer mensagem que você quiser hehe
Rodrigo_Sasaki
mesmo sendo um objeto instanciado dentro do for… ele está adicionando eles à lista que ele tem dentro da empresa… então a referência não é perdida.
Imagino que o método contem deveria funcionar dessa maneira:
if(empresa.contem(f)){
//código...
}
Y
yuri_ev
mesmo sendo um objeto instanciado dentro do for… ele está adicionando eles à lista que ele tem dentro da empresa… então a referência não é perdida.
Até posso estar errado pois só olhei o código por cima, mas toda a vez que entra no laço cria uma instancia de Funcionario e adiciona na lista. Como saberia qual “f” é o que está passando como parâmetro? Confere aí…
leoviniga
mesmo sendo um objeto instanciado dentro do for… ele está adicionando eles à lista que ele tem dentro da empresa… então a referência não é perdida.
Até posso estar errado pois só olhei o código por cima, mas toda a vez que entra no laço cria uma instancia de Funcionario e adiciona na lista. Como saberia qual “f” é o que está passando como parâmetro? Confere aí…
for(inti=0;i<empresa.empregados.length;i++){Funcionariof=newFuncionario();f.salario=1000+i*100;//if temporario para testar o metodo contem if(i==0)f.rg="456456";elsef.rg="777";empresa.adiciona(f);}// Como utilizo o metodo abaixo? empresa.contem(f);
Realmente…nem tinha me tocado…você teria que chamar o método contem dentro do for, ou criar o Objeto antes do for…vai depender do que você quer
F
frostbyte
E como eu busco o funcionario cujo rg é 456456?
f.rg=“456456”;
Esse comando
if(this.empregados[i].rg==f.rg)
ficaria assim é isso: if (this.empregados[i].rg.equals(f.rg))
leoviniga
frostbyte:
E como eu busco o funcionario cujo rg é 456456?
f.rg=“456456”;
Esse comando
if(this.empregados[i].rg==f.rg)
ficaria assim é isso: if (this.empregados[i].rg.equals(f.rg))
Isso mesmo…o comando fica assim
O ideal seria você testar seus métodos assim:
Crie 3 Objetos funcionario…com valores distintos ou iguais você descide…
chame o método adicionar com 2 deles…
e chame o método contém com o outro…
Daí ponha algo tipo um System.out.println(“Está na empresa”) dentro do if (this.empregados[i].rg.equals(f.rg))
F
frostbyte
Agora meu código tá assim:
publicclassTestaEmpresa{publicstaticvoidmain(String[]args){Empresaempresa=newEmpresa();empresa.empregados=newFuncionario[5];for(inti=0;i<empresa.empregados.length;i++){Funcionariof=newFuncionario();f.salario=1000+i*100;//if temporario para testar o metodo contemif(i==0)f.rg="456456";elsef.rg="777";empresa.adiciona(f);if(empresa.contem(f)){System.out.println("contem funcionario");}}empresa.mostraEmpregados();}}
publicclassEmpresa{Stringnome;Stringcnpj;Stringendereco;staticintcontrolador=0;Funcionario[]empregados;voidadiciona(Funcionariof){if(controlador<empregados.length){this.empregados[controlador]=f;controlador++;}elseSystem.out.println("Array cheio.");}voidmostraEmpregados(){for(inti=0;i<this.empregados.length;i++){System.out.println("Funcionario: "+this.empregados[i].rg);}}// Método para verificar se um determinado Funcionario se encontra ou não como// funcionário desta empresa:booleancontem(Funcionariof){booleanflag=false;for(inti=0;i<this.empregados.length;i++){if(this.empregados[i].rg.equals(f.rg))// Não sei se esse codigo ta certo!flag=true;}returnflag;}}
Rodrigo_Sasaki
leoviniga:
for(inti=0;i<empresa.empregados.length;i++){Funcionariof=newFuncionario();f.salario=1000+i*100;//if temporario para testar o metodo contem if(i==0)f.rg="456456";elsef.rg="777";empresa.adiciona(f);}// Como utilizo o metodo abaixo? empresa.contem(f);
Realmente…nem tinha me tocado…você teria que chamar o método contem dentro do for, ou criar o Objeto antes do for…vai depender do que você quer
qual o problema com o contem(f) fora do for… sendo que a referência está dentro de empresa? não entendi…
Ainda nao ta resolvido. Pessoal, me desculpem se estou escrevendo besteiras. To cansado, passei o dia tentando resolver isso e acho que nem to pensando direito…
Obrigado aos amigos que estão me ajudando com toda a paciência do mundo.
eu gostaria de saber como faço pra fazer uma busca no vetor de empregados (empresa.empregados = new Funcionario[5];) pelo rg desse valor 456456 (f.rg="456456";)
Y
yuri_ev
A referência de f é o Funcionario que só existe dentro do laço
leoviniga
Dá uma pesquisada sobre escopo de classe
kritiuns
Brow acho que falta vc instanciar seu array
Funcionariof[]=newFuncionario[tamanho];
–edit
ops desculpe não tinha visto a linha em q vc instancia o array no seu método main.
Rodrigo_Sasaki
ah … entendi… você ta falando da própria referencia de f que não existe mais… não que a referência do objeto não exista… saquei
desculpa ai
kritiuns
publicclassTestaEmpresa{publicstaticvoidmain(String[]args){Empresaempresa=newEmpresa();empresa.empregados=newFuncionario[5];for(inti=0;i<empresa.empregados.length;i++){Funcionariof=newFuncionario();f.salario=1000+i*100;//if temporario para testar o metodo contem if(i==0)f.rg="456456";elsef.rg="777";empresa.adiciona(f);}// Como utilizo o metodo abaixo? //essa hora vc precisa ter um outro objeto de Funcionario instanciado para pesquisar ....tente assimFuncionariotesteFunc=newFuncionario();testeFunc.setRg("12345")// ou testeFunc.rg = "12345";sysout(empresa.contem(testeFunc));}}
e acho que o controlador estático fica meio estranho… você pode ter problemas se tiver mais de uma empresa.
edit: se decidir que quer deixar o controlador como estático… remova o ‘this’ no controlador dentro do for…
leoviniga
frostbyte…
Você está utilizando alguma IDE para desenvolver suas aplicações?
Elas te ajudam a identificar e corrigir erros básicos como de escopo de classe e chamada de métodos que as vezes passam despercebidos…
Rodrigo_Sasaki
o problema é que quando ele está adicionando o f, ele logo depois chama o contem(), que corre o array todo pela sua propriedade length… que no caso é 5
então no momento ele está assim: array[f, null, null, null, null]
na hora em que ele testa o rg com o primeiro dado do array nenhum problema o corre… agora quando ele pergunta o rg do segundo dado que é um null… lança uma NullPointerException… por isso achei melhor ele usar o controlador… que quando adiciona 1 dado… vale 1… então testa o contem() em apenas um registro… e esse problema ja não ocorre mais
frostbyte…
Você está utilizando alguma IDE para desenvolver suas aplicações?
Elas te ajudam a identificar e corrigir erros básicos como de escopo de classe e chamada de métodos que as vezes passam despercebidos…