Jump to content

Trabalhar com ArrayList de outras classes


NoobCodec
 Share

Recommended Posts

Boa noite comunidade, o meu problema é que o seguinte:

Estou a começar a aprender java e encontrei aqui um trabalho em que tenho de ler equipas de um .txt e depois gerar jogos entre as equipas e actualizar a classificação.

Comecei por fazer uma classe LeFicheiro que lê as linhas(Nomes das equipas) de um .txt e guarda numa ArrayList<String> nomes.

public class LeFicheiro
{


public static void main(String[] args){
    ArrayList<String> nomes=new ArrayList(16);
    boolean existe=false;
    String nomeArq=""; // nome do arquivo
    String linha="";

    Scanner ler = new Scanner(System.in);
    System.out.println("Qual é o nome do ficheiro que pretende ler:\n");
    nomeArq=ler.nextLine();

    File arq=new File(nomeArq);

    //Arquivo existe
    if(arq.exists()){
        System.out.println("O nome do arquivo Existe.\n");existe=true;
    }
    else {System.out.println("O arquivo nao existe.\n");}

if(existe==true) {
    System.out.println("O conteudo do arquivo:\n");
    //tentando ler arquivo
    try{
    //abrindo arquivo para leitura
    FileReader paLer = new FileReader(nomeArq);
    //leitor do arquivo
    BufferedReader leitor = new BufferedReader(paLer);

    linha=leitor.readLine();// lê a primeira linha
    nomes.add(linha);
    while(linha!=null){
        System.out.println(""+linha);

        linha=leitor.readLine();
        nomes.add(linha);
    }
    paLer.close();
}catch(IOException e) {
        System.err.printf("Erro na abertura do aquivo:%s.\n",e.getMessage());
    }
    System.out.println();
}
}

}

Ela realiza a sua função, de certeza não da forma mais correta mas ela lê e imprime os nomes. O problema é, como eu trabalho com este array nas outras classes?

Eu fiz uma Classe Equipa que basicamente só tem uma String nome:

public class Equipa
{
private String nomeEquipa; //nome equipa

public Equipa(){
    this.nomeEquipa="";
}

public Equipa(String nome){
    this.nomeEquipa=nome;
}

public Equipa(Equipa e){
    this.nomeEquipa=e.getNomeEquipa();
}

public String getNomeEquipa(){
    return this.nomeEquipa;
}



public void setNomeEquipa(String nom){this.nomeEquipa=nom;}

public boolean equals(Object o){
    if(this==o) return true;

    if((o==null)||(this.getClass()!=o.getClass()))
        return false;
    else{
            Equipa e=(Equipa)o;
            return(this.nomeEquipa.equals(e.getNomeEquipa()));
    }
}

public String toString(){
    return new String("Nome da Equipa: "+nomeEquipa);
}
public Equipa clone(){return new Equipa(this);}


}

e depois uma classe jogo que tem um ArrayList<Equipa> e agora queria ir buscar os nomes do ArrayList nomes da class LeFicheiro e não sei como fazer. O que estava a tentar foi o seguinte:

public void insereEquipas(){
    LeFicheiro.main(String[] args);
}

Queria executar a função main do LeFicheiro para ler os nomes e depois percorria o arraylist e copiava nome a nome para o ArrayList da classe Jogo para depois trabalhar com ele.

Peço desculpa mas ainda estou a começar neste mundo.

Cumprimentos e obrigado

Link to comment
Share on other sites

Bom dia,

Em primeiro lugar bem-vindo ao maravilhoso mundo do JAVA :-)

O verdadeiro problema não é aqui : "Trabalhar com ArrayList de outras classes". O problema é saber fazer a arquitetura de um programa JAVA.

Para arquitecturar uma aplicação é preciso bem descrever (story telling do Use Cases) : neste caso não é muito claro a sua descrição da classe Jogo :

"depois gerar jogos entre as equipas e actualizar a classificação."

A aplicação é dividida desta forma :

1- IHM = Interface homem-máquina (Camada de Apresentação), neste caso, pode ser a Consola : Scanner(System.in)

2- Ler e analisar sintaticamente um fichiero contendo equipas. Instanciar um objecto java de tipo Equipa cada vez que o analisador sintatico encontra uma equipa no ficheiro.

Adicionar cada instancia da classe Equipa no ArrayList do objecto de tipo Jogo.

Observação : o arquivo teria sido mais interessante se fosse em formato XML ou JSON.

3- Na classe Jogo (que contém o ArrayList com todas as équipas) gerar os jogos entre as equipas e actualizar a classificação.

Resumo : 3 classes :

1- Classe principale (main) chamada com o nome do programa Java. permite a Interface homem-máquina

2- Classe Equipa com os atributos : nome da équipa e possivelmente sua pontuação, os membros de sua equipe etc.

3- Classe Jogo que contém o ArrayList com todas as équipas e permite gerar os jogos entre as equipas e actualizar a classificação.

Para isso é preciso substituir ArrayList<String> nomes=new ArrayList(16); por algo parecido com isto : Jogo<Equipa> jogo = new Jogo();

Depois :

jogo.setEquipa(equipa);

Conclusão não precisa ter dois ArrayList

Engenharia de Software: Antes de iniciar um programa agare numa caneta e papel e desenha uma imagem da arquitectura do seu programe. Como fazem os arquitectos em engenharia civil.

Edited by Ernest Duarte
  • Vote 1
Link to comment
Share on other sites

Bom dia,

Em primeiro lugar bem-vindo ao maravilhoso mundo do JAVA :-)

O verdadeiro problema não é aqui : "Trabalhar com ArrayList de outras classes". O problema é saber fazer a arquitetura de um programa JAVA.

Para arquitecturar uma aplicação é preciso bem descrever (story telling do Use Cases) : neste caso não é muito claro a sua descrição da classe Jogo :

"depois gerar jogos entre as equipas e actualizar a classificação."

A aplicação é dividida desta forma :

1- IHM = Interface homem-máquina (Camada de Apresentação), neste caso, pode ser a Consola : Scanner(System.in)

2- Ler e analisar sintaticamente um fichiero contendo equipas. Instanciar um objecto java de tipo Equipa cada vez que o analisador sintatico encontra uma equipa no ficheiro.

Adicionar cada instancia da classe Equipa no ArrayList do objecto de tipo Jogo.

Observação : o arquivo teria sido mais interessante se fosse em formato XML ou JSON.

3- Na classe Jogo (que contém o ArrayList com todas as équipas) gerar os jogos entre as equipas e actualizar a classificação.

Resumo : 3 classes :

1- Classe principale (main) chamada com o nome do programa Java. permite a Interface homem-máquina

2- Classe Equipa com os atributos : nome da équipa e possivelmente sua pontuação, os membros de sua equipe etc.

3- Classe Jogo que contém o ArrayList com todas as équipas e permite gerar os jogos entre as equipas e actualizar a classificação.

Para isso é preciso substituir ArrayList<String> nomes=new ArrayList(16); por algo parecido com isto : Jogo<Equipa> jogo = new Jogo();

Depois :

jogo.setEquipa(equipa);

Conclusão não precisa ter dois ArrayList

Engenharia de Software: Antes de iniciar um programa agare numa caneta e papel e desenha uma imagem da arquitectura do seu programe. Como fazem os arquitectos em engenharia civil.

Bem, obrigado pelas boas vinda e pela disponibilidade. Realmente acho que o primeiro erro foi mesmo a parte da caneta e do papel.

Estive a fazer alterações ao código, já percebi como trabalhar com os métodos das outras classes e também fiz um esquema dos próximos passos.

Vou postar aqui o codigo e tentar explicar a minha duvida.

1- Já tenho o ArrayList com os nomes das equipas, melhorei a class Jogo e Equipa;

2- Agora tenho de criar um jogo e achei melhor criar na classe Equipa um arraylist de jogos;

3- Na classe jogo vou criar um método que recebe duas equipas gera um numero de golos random entre 0-5 para cada uma delas e determina a vencedora;

4- O problema é se passar esta equipa vencedora como faço para na classe Equipa ter algo que registe esta vitoria numa determinada equipa?Pois se mais tarde vou querer gerar uma classificação vou precisar desses dados.

public class Main
{    
    public static void main(String[] args){
        ArrayList<String> arrL=new ArrayList<String>();
        String nomeArq="";
        LeFicheiro lf=new LeFicheiro();
        Scanner ler = new Scanner(System.in);
        System.out.println("Qual é o nome do ficheiro que pretende ler:\n");
        nomeArq=ler.nextLine();
        arrL=lf.leEquipa(nomeArq);
        System.out.println("O conteudo do arquivo:\n");
        for(String st:arrL){System.out.println("-"+st);}
    }
}

public class LeFicheiro
{
private ArrayList<String> listaNomes;

public LeFicheiro(){
    this.listaNomes=new ArrayList<String>();
}

public LeFicheiro(ArrayList<String> novo){
    this.listaNomes=novo;
}

public LeFicheiro(LeFicheiro lf){
    this.listaNomes=lf.getNomes();
}

public ArrayList<String> getNomes(){
    ArrayList<String> aux=new ArrayList<String>();
    for(String st:listaNomes){aux.add(st);}

    return aux;
}
public ArrayList<String> leEquipa(String nomeArq ){


    List<String> nomes;
    boolean existe=false;
    ArrayList<String> linha=new ArrayList<String>();



    File arq=new File(nomeArq);

    //Arquivo existe
    if(arq.exists()){
        System.out.println("O nome do arquivo Existe.\n");existe=true;
    }
    else {System.out.println("O arquivo nao existe.\n");}

if(existe==true) {

    try{
    //abrindo arquivo para leitura
    FileReader paLer = new FileReader(nomeArq);
    //leitor do arquivo
    BufferedReader leitor = new BufferedReader(paLer);

    String aux;
    aux=leitor.readLine();
    while(aux!=null){
        linha.add(aux);
        aux=leitor.readLine();
    }
    paLer.close();
}catch(IOException e) {
        System.err.printf("Erro na abertura do aquivo:%s.\n",e.getMessage());
    }
    System.out.println();
}
    return linha;
}

}

public class Jogo
{


private String equipaA;
private String equipaB;
int res1;
int res2;

public Jogo(){

    this.equipaA="";
    this.equipaB="";
    this.res1=0;
    this.res2=0;
}

public Jogo(String eA,String eB,int r1,int r2){
    this.equipaA=eA;
    this.equipaB=eB;
    this.res1=r1;
    this.res2=r2;
}

public Jogo(Jogo umJ){
    this.equipaA=umJ.getEquipaA();
    this.equipaB=umJ.getEquipaB();
    this.res1=umJ.getRes1();
    this.res2=umJ.getRes2();
}

public String getEquipaA(){return this.equipaA;}

public String getEquipaB(){return this.equipaB;}

public int getRes1(){return this.res1;}

public int getRes2(){return this.res2;}

public void setEquipaA(String a){this.equipaA=a;}

public void setEquipaB(String b){this.equipaB=b;}

public void setRes1(int a){this.res1=a;}

public void setRes2(int b){this.res2=b;}

//public criaJogo(String a,String b){

// }
public boolean equals(Object o){
    if(this==o) return true;

    if((o==null)||(this.getClass()!=o.getClass()))
        return false;
    else{
            Jogo j=(Jogo)o;
            return (this.equipaA.equals(j.getEquipaA())&&this.equipaB.equals(j.getEquipaB())
                    &&this.res1==j.getRes1()&&this.res2==j.getRes2());
    }
}

public String toString(){
    return new String("Equipa A: "+equipaA
                        +"Equipa B: "+equipaB
                        +"Resultado Equipa A: "+res1
                        +"Resultado Equipa B: "+res2);
}
/**
    * clone
    */
public Jogo clone() {
    return new Jogo(this);
}
}

public class Equipa
{
private String nomeEquipa; //nome equipa
ArrayList<Jogo> jogosEquipas;

public Equipa(){
    this.nomeEquipa="";
    this.jogosEquipas=new ArrayList<Jogo>();
}

public Equipa(String nome){
    this.nomeEquipa=nome;
}

public Equipa(Equipa e){
    this.nomeEquipa=e.getNomeEquipa();
    this.jogosEquipas=e.getJogosEquipas();
}

public String getNomeEquipa(){
    return this.nomeEquipa;
}

public ArrayList<Jogo> getJogosEquipas(){
    ArrayList<Jogo> aux=new ArrayList<>();
    for(Jogo jg:jogosEquipas){aux.add(jg.clone());}

    return aux;
}

public void setNomeEquipa(String nom){this.nomeEquipa=nom;}

public boolean equals(Object o){
    if(this==o) return true;

    if((o==null)||(this.getClass()!=o.getClass()))
        return false;
    else{
            Equipa e=(Equipa)o;
            return(this.nomeEquipa.equals(e.getNomeEquipa()));
    }
}

public String toString(){
    return new String("Nome da Equipa: "+nomeEquipa);
}

public Equipa clone(){return new Equipa(this);}


}

Aqui esta, o que pretendo agora é uma ajudar ou seja uma linha de pensamento para o próximo passo. Acha que fiz bem em definir as classes Jogo e Equipa assim?

Cmps e muito obrigado

Link to comment
Share on other sites

Bom dia,

Num programa em primeiro é necessário bem definir a arquitetura e estrutura do programa (que respeite a programação orientada a objetos, pelo menos no caso de JAVA).

Em seguida, definimos as etapas no codigo do programa para implementar os algoritmos, mas em primeiro deve bem pensar e defenir a arquitetura e estrutura do programa.

Na fase de design e arquitetura não se importe do ArrayList e até mesmo do codigo. Se você fizer uma boa arquitetura e estrutura do seu programa (Object-oriented programming (OOP)) você vai ver que o problema vai desaparecer por si só.

Para bem programar em JAVA, você deve conhecer os conceitos e as técnicas de concepção e programação orientada a objetos:

herança, polimorfismo, encapsulamento, modularidade, composição e agregação, ligação tardia (late binding) ...

Outra coisa muito importante a concepção e programação orientada a objetos foi pensada para se aproximar o máximo do pensamento dos seres humanos (do cérebro dos humanos).

E o mais longe possível da linguagem da máquina. Dito de outra maneira você deve pensar e concever o sistema informatico como você pensa naturalmente.

Na concepção e programação orientada a objetos há uma regra: tudo deve ficar no seu devido lugar.

Por exemplo num jogo participam duas equipas. E não o contrario uma equipa não é constituida de jogos pelo menos que eu saiba.

Para obter uma boa arquitetura e estrutura é necessário primeiro definir as entidades (classes e objectos Java) e depois as interações (herança, polimorfismo, encapsulamento, modularidade, composição e agregação) entre essas entidades.

A arquitetura e estrutura é defenida na linguagem UML ( http://www.uml.org/ ). Mas no seu caso o projeto é mesmo muito simples por isso UML fica para o proximo projeto JAVA.

Exemplo de procedimento para fazer algo corretamente :

Primeiro é preciso bem descrever (Story Telling dos casos de uso / "Use Cases") : Especificações das necessidades do projeto :

Exemplos de Use Cases {

O objetivo é implementar um projeto em que no jogo duas equipas competem.

O programa deve ler as equipas a partir de um ficheiro de dados ao frmato .txt e depois gerar jogos entre as equipas e actualizar a classificação.

Basta pensar na Copa do Mundo no Brasil. E pensar como concever e desenvolver um programa para gerenciar equipas e pontuações (scores) e classificações até o final passando por o de quarto final.

}

A partir dos Use Cases, definir as Classes e Entidades do sistema:

MainIHM : permite a interação entre o usuário eo programa. pregunta o nome do fichiero, e também pode meter as equipas a jugar no jogo.

AnalisadorSintático : permite ler((Input) analisar o ficheiro e criar (new) as equipas

Equipa : definir as propriedades e métodos ou seja o comportamento do objeto de tipo Equipa

Jogo : definir as propriedades e métodos ou seja o comportamento do objeto de tipo Jogo

Scores : define nas suas propriedades um histórico com a classificação das equipas.

A escolha dos nomes de métodos e classes JAVA é muito, muito importante porque é o vocabulário da história que descreve os casos de uso da Especificações das necessidades do projeto.

Uma vez as Classes e Entidades do sistema definidas pense na maneira como eles vão interagir uns com os outros no quadro da concepção e programação orientada a objetos (herança, polimorfismo, encapsulamento, modularidade, composição e agregação).

Esta maneira de fazer é uma experiência de mais de 15 anos em JAVA. Por isso tente aplicá-la corretamente.

Leia de novo, se você não entender tudo por que é fondamental esta abordagem.

Cordialmente

Edited by Ernest Duarte
Link to comment
Share on other sites

Bem, eu só posso dizer obrigado pela sua atenção.

Vou então "recomeçar" e pensar de tudo desde o inicio. Mas antes vou ler algo mais sobre "herança, polimorfismo, encapsulamento, modularidade, composição e agregação, ligação tardia (late binding) ..." ,"Para obter uma boa arquitetura e estrutura é necessário primeiro definir as entidades (classes e objectos Java) e depois as interações (herança, polimorfismo, encapsulamento, modularidade, composição e agregação) entre essas entidades.".

Tenho este livro :

Título: JAVA6 e Programação Orientada pelos Objectos

Autor: Fernando Mário Junqueira Martins

Acha que é um bom manual para me ambientar com as classes e objectos?

Continuação de um bom dia, Cmps

Link to comment
Share on other sites

Bom dia,

Você deve aprender os conceitos da OOP (Programação Orientada a Objectos) em simultâneo com o desenvolvimento de mini-projectos como este gestão dos Jogos, Equipas etc.

Por isso não é necessário começar tudo de novo, mas sim continuar a aprender modelagem orientada a objetos graças a este projeto JAVA.

Um desenvolvedor é como um pedreiro que deve estar de acordo com as regras da arquitetura da aplicação.

Em outras palavras, devemos agir localmente, mas pensar globalmente. Ou seja, você deve codificar mas não esqueçer os conceitos por trás do código.

Partindo da especificações das necessidades do projeto até à realização deste exemplo.

Quanto ao livro do Professor Associado do Departamento de Informática da Universidade do Minho.

Autor do livro JAVA6 e Programação Orientada pelos Objectos.

Autor dos livros Programação Orientada aos Objectos em JAVA2 e JAVA5 e Programação por Objectos, também publicados pela FCA.

Nota: O idioma Português é uma língua que é construída historicamente em torno da poesia e não sobre ciência e tecnologia. Daí a dificuldade de estudiosos, acadêmicos

em traduzir os escritos de ciência e tecnologia a partir do Inglês e Francês.

Uma vez é por Objectos outra aos Objectos e para acabar pelos Objectos ... pessoalmente, eu prefiro : Programação Orientada a Objectos

Parece-me que este documento é muito bom

http://www.di.ubi.pt/~pprata/poo/POO_10_11_T01.pdf

Para mim, os melhores livros sobre JAVA, na língua de Luís Vaz de Camões, está localizado no Brasil :

http://www.portugal-a-programar.pt/topic/65183-melhor-livro-java-feup/

Cordialmente

Edited by Ernest Duarte
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.