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:
[quote]…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.[/quote]
Não consegui fazer esse método empresa.mostraEmpregados(); funcionar. Alguem sabe o motivo ?
[code]
public class TestaEmpresa {
public static void main (String[] args){
Empresa empresa = new Empresa();
empresa.empregados = new Funcionario[5];
for (int i = 0; i < empresa.empregados.length; i++) {
Funcionario f = new Funcionario();
f.salario = 1000 + i * 100;
//if temporario para testar o metodo contem
if (i == 0)
f.rg="456456";
else
f.rg="777";
empresa.adiciona(f);
}
// Como utilizo o metodo abaixo?
empresa.contem(f);
}
}[/code]
public class Empresa {
String nome;
String cnpj;
String endereco;
static int controlador = 0;
Funcionario[] empregados;
// o controlador será usado para guardar o índice livre mais proximo do vetor empregados
void adiciona(Funcionario f){
if (controlador < empregados.length){
this.empregados[controlador] = f;
controlador++;
}
else
System.out.println("Array cheio.");
}
void mostraEmpregados() {
for (int i=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:
boolean contem(Funcionario f){
boolean flag = false;
for (int i=0; i<this.empregados.length; i++){
if (this.empregados[i].rg == f.rg)
flag = true;
}
f.estaNaEmpresa = flag;
return f.estaNaEmpresa;
}
}
ele gera algum erro? se sim poste aqui 
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 ^^
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.
[quote=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 ^^[/quote]
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…
Você está criando o Funcionario f dentro do laço “for” e tentando usar ele fora do laço.
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:
boolean contem(Funcionario f){
boolean flag = false;
for (int i=0; i<this.empregados.length; i++){
if (this.empregados[i].rg == f.rg)
flag = true;
}
return flag;
}
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
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.
if (this.empregados[i].rg == f.rg)
Se rg estiver como string (imagino que esteja) utilize o método equals para compara-los…
Mais info: http://www.guj.com.br/java/241198-resolvido-diferenca-entre-equals-e-
Imagino que o método contem deveria funcionar dessa maneira:
if (empresa.contem(f)){
//código...
}
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.[/quote]
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í…
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.[/quote]
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í…[/quote]
for (int i = 0; i < empresa.empregados.length; i++) {
Funcionario f = new Funcionario();
f.salario = 1000 + i * 100;
//if temporario para testar o metodo contem
if (i == 0)
f.rg="456456";
else
f.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
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))
[quote=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))
[/quote]
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))
Agora meu código tá assim:
[code]public class TestaEmpresa {
public static void main (String[] args){
Empresa empresa = new Empresa();
empresa.empregados = new Funcionario[5];
for (int i = 0; i < empresa.empregados.length; i++) {
Funcionario f = new Funcionario();
f.salario = 1000 + i * 100;
//if temporario para testar o metodo contem
if (i == 0)
f.rg="456456";
else
f.rg="777";
empresa.adiciona(f);
if (empresa.contem(f)){
System.out.println("contem funcionario");
}
}
empresa.mostraEmpregados();
}
}
[/code]
public class Empresa {
String nome;
String cnpj;
String endereco;
static int controlador = 0;
Funcionario[] empregados;
void adiciona(Funcionario f){
if (controlador < empregados.length){
this.empregados[controlador] = f;
controlador++;
}
else
System.out.println("Array cheio.");
}
void mostraEmpregados() {
for (int i=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:
boolean contem(Funcionario f){
boolean flag = false;
for (int i=0; i<this.empregados.length; i++){
if (this.empregados[i].rg.equals(f.rg)) // Não sei se esse codigo ta certo!
flag = true;
}
return flag;
}
}
[quote=leoviniga]
for (int i = 0; i < empresa.empregados.length; i++) {
Funcionario f = new Funcionario();
f.salario = 1000 + i * 100;
//if temporario para testar o metodo contem
if (i == 0)
f.rg="456456";
else
f.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[/quote]
qual o problema com o contem(f) fora do for… sendo que a referência está dentro de empresa? não entendi…
ta resolvido seu problema frostbyte ?
[quote]Exception in thread “main” java.lang.NullPointerException
at Empresa.contem(Empresa.java:35)
at TestaEmpresa.main(TestaEmpresa.java:26)[/quote]
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";
)
A referência de f é o Funcionario que só existe dentro do laço
Dá uma pesquisada sobre escopo de classe
Brow acho que falta vc instanciar seu array
Funcionario f[] = new Funcionario[tamanho];
–edit
ops desculpe não tinha visto a linha em q vc instancia o array no seu método main.
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 