Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

Dúvida sobre Arrays gerais do JAVA.

Pessoal, boa noite. No curso de Java Básico (1) os instrutores abordam arrays e os exercicios pedem para criar um Array Funcionarios, eu consegui criar, compilou tudo certinho e tudo mais. Minha dúvida é a seguinte, O Array para funcionario[] foi criado, certo? ok. No entanto nesse caso eu teria que criar também um array para os pagamentos do funcionarios? No caso: pagamentoFuncionarios[], ou dar para colocar os atributos, comportamentos tudo em um mesmo array? no caso o funcionario[] ?

Grato.

15 respostas

Felipe, não entendi a sua pergunta porque não sei o contexto do exercício. Pode explicar melhor?

Ok. Vamos lá!

Empresa {
funcionario[] empregados;
}

class Pagamentos { 
double salario;
double salarioAnual;
}

Analisando eu tenho um Array para os empregados, a minha dúvida é a seguinte:

No caso do pagamento, eu teria que criar um novo Array só para pagamentos? Ou daria para armazenar funcionarios, pagamentos, tudo junto?

Nesse seu caso é so vc ir ate a classe Empregados e adicionar o seguinte atributo.

Pagamento pagamento;

a partir dai o empregado ia ter seu pagamento e o array ia armazenar o empregado juntamente com seu pagamento.

agora separadamente não é possivél, o array de empregados armazena somente empregados.

public class Funcionario2 {
    PessoaFuncionario funcionarioPessoa;
    Pagamentos pagamentos;
    DescricaoEmpresa empresa;
    DataFuncionarioEmpresa data;
}
class Pagamentos{

    double salario;
    double aumentoSalario;

    // Métodos...
    void salarioFuncionario(double salario) {
        this.salario = salario;
    }

    void funcionarioRecebeAumento(double aumentoSalario) {
        this.aumentoSalario += aumentoSalario;
        this.salario += aumentoSalario;
    }

    double calculaSalarioAnual() {
        return this.salario *= 12;
    }

    void exibeInformacoesGerais() {

    }

}
class PessoaFuncionario {

    String nome;
    String rg;
    String cpf;
    String contato;
    char sexo;
    int idade;

}
class DescricaoEmpresa {
    Funcionario2[] funcionariosArray;
    Pagamentos pagamentos;
    String nomeEmpresa;
    String cnpjEmpresa;
    String contatoEmpresa;

    void exibeInformacoes() {

        System.out.println();
        System.out.println(">>>>>>>>>>>>EMPRESA<<<<<<<<<<");
        System.out.println();
        System.out.println("Empresa: " + nomeEmpresa + "\nCNPJ: " + cnpjEmpresa
                + "\nContato empresa: " + contatoEmpresa);

        for (int i = 0; i < funcionariosArray.length; i++) {
            Funcionario2 funcionario = this.funcionariosArray[i];
            if (funcionario == null)
                continue;
            System.out.println();
            System.out.println(">>>>>>>>>>DADOS DO FUNCIONÁRIO<<<<<<<<<");
            System.out.println();
            System.out.println("Nome Funcionário: "
                    + funcionario.funcionarioPessoa.nome + "\nCPF: "
                    + funcionario.funcionarioPessoa.cpf + "\nRG:"
                    + funcionario.funcionarioPessoa.rg + "\nContato: "
                    + funcionario.funcionarioPessoa.contato + "\nIdade: "
                    + funcionario.funcionarioPessoa.idade + "\nSexo: "
                    + funcionario.funcionarioPessoa.sexo + "\nData de entrada:"
                    + funcionario.data.dataFormatada());

        }

        System.out.println();
        System.out.println();
        System.out.println(">>>>>>>>>>>>PAGAMENTO FUNCIONÀRIO<<<<<<<<<<<<");
        System.out.println();
        System.out.println("Salário: " + pagamentos.salario
                + "\nSalário com Aumento: " + pagamentos.aumentoSalario
                + "\nSalário Anual: " + pagamentos.calculaSalarioAnual());
    }
}

Amigo, veja que eu pensei a mesma coisa que você, ainda assim não consigo imaginar tudo de um mesmo array ainda.

Pessoal consegui, muito obrigado.

Felipe, não sei se entendi bem o que você está pensando, mas parece que você está em dúvida não com a informação de um pagamento em particular, mas com todos os pagamentos de um determinado funcionário, é isso mesmo? Bem, se for realmente isso, você teria que ter um array de pagamentos dentro da classe funcionário e um atributo que retorne esse array para a classe cliente (que usa a classe funcionário). Assim, no caso da classe empresa, você teria um array de funcionários em que cada item desse array possui um array de pagamentos. Seria algo mais ou menos assim:

class Funcionário {
   Pagamentos[] pagamentos;

   ...

   public Pagamentos[] getPagamentos(){
       return this.pagamentos; 
   }

   ... 

}

Entendeu? Se não for nada disso que eu estou falando, por favor me corrija e explique melhor o que você está tendo dificuldade, para a gente tentar entender melhor e te ajudar.

Pelo que pude entender você juntou todas as suas classes como atributos da classe funcionário2.

o correto seria o seguinte.

class Funcionario {
    String nome;
    String rg;
    String cpf;
    String contato;
    char sexo;
    int idade;
    Pagamentos pagamento;
}

class Pagamentos{
    double salario;

    // Métodos...
    void salarioFuncionario(double salario) {
        this.salario = salario;
    }
    void funcionarioRecebeAumento(double aumentoSalario) {
        this.salario += aumentoSalario;
    }
    double calculaSalarioAnual() {
        return this.salario *= 12;
    }
    void exibeInformacoesGerais() {
    }
}

class Empresa {
    Funcionario[] funcionariosArray;
    String nomeEmpresa;
    String cnpjEmpresa;
    String contatoEmpresa;

 void exibeInformacoes() {
        System.out.println();
        System.out.println(">>>>>>>>>>>>EMPRESA<<<<<<<<<<");
        System.out.println();
        System.out.println("Empresa: " + nomeEmpresa + "\nCNPJ: " + cnpjEmpresa
                + "\nContato empresa: " + contatoEmpresa);
        for (int i = 0; i < funcionariosArray.length; i++) {
            Funcionario2 funcionario = this.funcionariosArray[i];
            if (funcionario == null)
                continue;
            System.out.println();
            System.out.println(">>>>>>>>>>DADOS DO FUNCIONÁRIO<<<<<<<<<");
            System.out.println();
            System.out.println("Nome Funcionário: "
                    + funcionario.funcionarioPessoa.nome + "\nCPF: "
                    + funcionario.funcionarioPessoa.cpf + "\nRG:"
                    + funcionario.funcionarioPessoa.rg + "\nContato: "
                    + funcionario.funcionarioPessoa.contato + "\nIdade: "
                    + funcionario.funcionarioPessoa.idade + "\nSexo: "
                    + funcionario.funcionarioPessoa.sexo + "\nData de entrada:"
                    + funcionario.data.dataFormatada());
        }
        System.out.println();
        System.out.println();
        System.out.println(">>>>>>>>>>>>PAGAMENTO FUNCIONÀRIO<<<<<<<<<<<<");
        System.out.println();
        System.out.println("Salário: " + pagamentos.salario
                + "\nSalário com Aumento: " + pagamentos.aumentoSalario
                + "\nSalário Anual: " + pagamentos.calculaSalarioAnual());
    }
}

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

        Empresa empresa = new Empresa();
        Funcionário funcionario = new Funcionário();
        Pagamentos pagamentos = new Pagamentos();

        pagamentos.salario = 500.0;
        funcionario.pagamentos = pagamentos; //funcionário recebendo o pagamento do salário que foi feito agora de 500.0

        empresa.funcionariosArray = new Funcionário[1]; //vc instancia um objeto tipo array que ira guardar o funcionario com seu pagamento.
        empresa.funcionariosArray[0] = funcionario;

        // agora você ajusta seu metódo de exibir informações

    }
}

Eu consegui fazer já. Mais a ideia é essa: Pensa bem, se eu tenho uma empresa que contém vários funcionários é normal eu ter vários pagamentos também, pois cada Funcionário terá seu próprio pagamento correto? A minha dúvida era essa se dava para colocar tudo em um mesmo array, ou seja, funcionário e pagamentos. Tratando - se de objeto é possível. Veja bem:

class DescricaoEmpresa {
    Funcionario2[] funcionariosArray;
    Pagamentos pagamentos;
    String nomeEmpresa;
    String cnpjEmpresa;
    String contatoEmpresa;
empresa.funcionariosArray[0].funcionarioPessoa = new PessoaFuncionario();

// Aqui eu seto o array para receber o pagamento também.
empresa.funcionariosArray[0].pagamentos = new Pagamentos(); 

// Entrada de dados do pagamento...

// informaçoes do salário...
empresa.funcionariosArray[0].pagamentos.salarioFuncionario(100.0);
empresa.funcionariosArray[0].pagamentos.funcionarioRecebeAumento(50.0);

Entendeu? Ficaria mais organizado com 2 arrays, realmente. Mais ai, já teria outro problema, fazer a varredura dos dois arrays para identificar que uma posição daquele array é de um determinado funcionário..

Odenilton, dessa maneira que postei ai em cima é errado?

arrays são pouco chatos mesmo, você ira gostar quado trabalhar com as Collections são uma maravailha :D

não esta errado não so acredito que fique melhor de compreender, em programação existem diversas maneiras de se fazer uma mesma coisa :D

Eu tento seguir sempre a os bons modos de programar, vou tentar deixar mais padrão. Array é muito chato, é confuso demais.. Principalmente em java! :/

solução!

Felipe, da forma como eu falei mais acima acho que resolve o seu problema. Mas veja, uma collection não é conceitualmente tão diferente de um array, existem quetões técnicas, como arrays são armazenados no heap e collections na pilha, collection são dinâmicas pois são estruturas de dados baseadas em ponteiros, etc. Mas todos dois são essencialmente estrututras que permitem armazenar um número relativamente grande de valores (ou objetos) tratando-os como um conjunto e não variáveis isoladas , como f1, f2, f3... se você não entender bem os arrays não será mais fácil trabalhar com collections, pois o conceito de conjunto de objetos é o mesmo, apenas a implementação e a forma de acessá-los é que muda. Nesse seu caso você tem um conjunto de funcionários (array ou collection) e cada elemento desse conjunto possui um conjunto (array ou collection) de pagamentos. É isso que tentei descrever mais acima.

Sandro, agradeço pela sua explicação. Mas veja bem:

class Funcionário {
   Pagamentos[] pagamentos;

   public Pagamentos[] getPagamentos(){
      return this.pagamentos; 
   }

}

Eu até que entendi, estava pensando o mesmo. Agora pensa comigo: Eu tenho 2 arrays - Funcionario[] empregados; - Pagamentos[] pagamentos;

Como vou saber por exemplo, que o pagamento[5] é do funcionario[5] ? Entendeu ? Por isso optei por juntar.

Obrigado pelo esclarecimento de collections and arrays.

Felipe,

Veja bem, cada funcionário terá um conjunto de pagamentos só seu. Os pagamentos não vão se misturar, assim, no seu exemplo, para chegar no pagamento 5, eu tenho que chegar primeiro no funcionário 5. Desta forma eu sei exatamente de quem são os pagamentos que estou manipulando. O mesmo raciocínio se aplica para o uso de collections (Lists e companhia). Você também pode ter uma referência para o funcionário que o contém, nós chamamos isso de referência circular. Nas linguagens mais antigas isso era um problema sério no momento de desalocar a memória, mas nas linguagens mais modernas como Java e a família de linguagens .NET, isso deixou de ser um problema pois os gerenciadores de memória resolvem isso relativamente simples. Eu vivo essa situação em meus sistemas desenvolvidos em VB6 e VB.NET (estou pensando se vale a pena migrar para o Java que estou estudando para concursos) , onde tenho objetos que possuem coleções de outros objetos, que por sua vez possuem outras coleções, ou seja, eu tenho uma hierarquia de objetos em memória inter-relacionados. Quando quero manipular um item de nível mais interno dessa hierarquia, passo pelos objetos que o contém através de loops "For Each". não se preocupe, mais a frente nos cursos, você verá formas de tratar essas hierarquias. Pesquise também por padrões de projeto que pode dar uma ideia de como tratamos as coisas em sistemas mais complexos, e claro, qualquer dúvida pode postar que a gente tenta ajudar.