Jump to content
PauloM

ArrayList vs LinkedLists

Recommended Posts

PauloM

Olá pessoal.

Este é o meu primeiro (de muitos outros, espero! ) tópico aqui no fórum. Vou passar a explicar o que se passa. Sou completamente newbie  😳  em relação à programação em Java e estou a braços com um projecto para a Faculdade para o qual preciso da vossa ajuda. Para o projecto preciso de criar uma espécie de roteiro cultural com uma série de especificidades que não vos vou estar a maçar agora com os detalhes. Para começar, criei uma classe "Eventos" e o intuito era criar métodos para adicionar, editar e eliminar eventos (etc). Após uma pesquisa na net. cheguei ao seguinte código:


import java.util.*;
import static java.lang.System.out; 

public class Evento
{
//Declaração da ArrayList
ArrayList<String> Evts = new ArrayList<String>();
//Adiciona 3 eventos à lista
public void adicionaEvts()
{
Evts.add("Evt1");
Evts.add("Evt2");
Evts.add("Evt3");
out.println("Foram adicionados automaticamente 3 eventos");
out.println("==============================================");
}
//Adiciona à lista um evento com nome definido pelo utilizador
public void criarNovoEvt(String nome)
{
Evts.add(nome);
out.println ("Foi adicionado um evento com o nome "+nome);
out.println ("===========================================");
}
public void listarEvts()
{
out.println("Lista de Eventos");
for (String nome : Evts)
out.println(nome);
out.println("========================================");
}
public void tamanhoDaLista()
{
int a = Evts.size();
out.println("A lista tem "+a+" elementos");
out.println("==========================");
}
public void existe(String nome)
{
int i=0;
for (String events : Evts)
{
if (Evts.contains(nome)==true)
{
i++;
}
}
if (i==0)
out.println("Não Existe");
if (i>0)
out.println("Foram encontradas "+i+" ocorrencias do nome "+nome);
out.println("=================================================");
}
public void apagarTudo()
{
Evts.clear();
out.println("Todos os registos foram apagados");
}
public void apagaElemento(String nome)
{
Evts.remove(nome);
}
public void verificarVazio()
{
if (Evts.isEmpty()==true)
out.println("Está Vazio");
else if (Evts.isEmpty()==false)
out.println("Não está vazio");
}
}

O problema é que apenas consigo guardar uma informação para cada eventos (posição no ArrayList Evts). Como sugerem que faça a implementação para que para cada evento possa guardar vários dados como nome, local, data, etc.

Pensei em multidimensional arrays mas não faço a mínima ideia se estou a dizer um disparate  😳

Agradeço desde já qualquer ajuda que possam dar.

Edit: Também me lembrei que poderia criar uma nova ArrayList para cada evento. Criava um método criarArrayL e depois chamava-o sempre que instanciasse a classe Evento, cujo método construtor poderia ser:

public void Evento {

Evento eventox = new Evento();

}

Mas, mais uma vez, não sei se estou a dizer disparates.

Share this post


Link to post
Share on other sites
Baderous

Tens de ter uma classe Evento onde guardas toda a informação acerca de um evento:

public class Evento {
        private String nome;
        private Date data;
        private String local;
...
}

Depois na classe Eventos, terás então o teu ArrayList<Evento>:

public class Eventos {
        private ArrayList<Evento> eventos;
...
}

Quanto ao código que apresentaste, todo o código de I/O não deve estar nessa classe, mas sim numa classe principal onde definas toda a execução do programa desde o início ao fim. E há métodos como o de calcular o tamanho da lista e verificar se existe um elemento, que devem ser redefinidos para devolver um resultado, e não void.

Share this post


Link to post
Share on other sites
PauloM

Obrigado!

Portanto, sugeres que crie a classe Evento como extend a Eventos? Tipo


public class Evento extends Eventos {
        private String nome;
        private Date data;
        private String local;
...
}


Share this post


Link to post
Share on other sites
Baderous

Não, a classe Eventos é que deve ser definida como te disse. Não há cá extends, porque isso nem faz sentido.

Share this post


Link to post
Share on other sites
PauloM

Portanto tudo dentro da mesma classe Eventos, sendo a classe Evento uma Subclasse de Eventos. Certo?  :wallbash: Desculpa mas como disse sou novo nisto, mas hei-de chegar lá. Obrigado!

Share this post


Link to post
Share on other sites
Baderous

Não, não há subclasses. Se Evento fosse subclasse de Eventos, queria dizer que adicionaria algum estado e/ou comportamento extra à classe Eventos e não é isso que se verifica. São 2 classes independentes. Simplesmente a classe Eventos é constituída por uma lista de Evento.

Share this post


Link to post
Share on other sites
KTachyon

Se a lista de eventos é um singleton (só é instanciado uma vez), podes fazer da lista um objecto estático (class level).

public class Evento {
    public static ArrayList<Evento> lista = new ArrayList<Evento>();

    public Evento() {
        Evento.lista.add(this);
    }
}


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Baderous

Não achas que estás a abusar a introduzir conceitos desse nível a alguém que tem as dificuldades apresentadas? (para além de que o vai confundir com a explicação que lhe dei anteriormente)

Share this post


Link to post
Share on other sites
PauloM

Pessoal obrigado mais uma vez.

A ver se percebi.


public class Evento {
        private String nome;
        private Date data;
        private String local;
...
}

Esta é a classe que contém os elementos comuns a todos os eventos. Certo?

Agora, se quisesse criar uma classe "Concerto", sendo este um Evento, ficaria:


public class Concerto{

        private ArrayList<Evento> eventos;
        ...
}

Isto cria um array do tipo Evento. Certo? Este array teria como "campos" as variáveis de Evento?

Perdoem-me os termos técnicos que podem estar mal empregues.

Share this post


Link to post
Share on other sites
Baderous

Esta é a classe que contém os elementos comuns a todos os eventos. Certo?

Sim. Cada evento que cries terá esse conjunto de propriedades.

Quanto à criação da classe Concerto é preciso saber se precisas mesmo de distinguir um Concerto de um Evento (caso em que já se tem de recorrer a subclasses). Esse código que apresentaste não tem um array do tipo Evento, é uma classe que tem como variável de instância um ArrayList de eventos, ou seja, uma colecção de eventos (instâncias da classe Evento que terão as variáveis de instância nela definidas).

Share this post


Link to post
Share on other sites
PauloM

Exacto! Já estou a perceber mais um pouco disto. Portanto algumas das subclasses de evento que estava a pensar criar são Concerto, Museu, Atração Turística. Todas elas "herdam" (posso falar de herança neste contexto?) as propriedades de Evento mas têm cada uma delas propriedades próprias distintas das outras classes (subclasses). Por exemplo um Concerto terá Nome do Artista, etc. Se eu quiser criar uma lista com 1 Concerto, 1 Museu e 1 Atração Turística como devo proceder? A criação da ArrayList na SubClasse seria viável? Como seriam mantidos os registos durante a execução do programa?

Obrigado  :thumbsup:

Share this post


Link to post
Share on other sites
Baderous

Estás a pensar de forma correcta.

Se quiseres criar uma lista que suporte instâncias de qualquer subclasse de Evento, podes criar uma lista de Evento, e depois adicionar instâncias de Concerto, Museu, etc a essa lista. O mecanismo de polimorfismo de Java permite fazer isso. Podes fazer isto:

ArrayList<Evento> evts = new ArrayList<Evento>();
evts.add(new Concerto("Vagos Open Air","Nevermore"));
evts.add(new Museu("Museu da Imagem"));

Este ArrayList não surge nas subclasses, é criado numa Main (por exemplo), que é onde o utilizas.

Share this post


Link to post
Share on other sites
PauloM

Wow Baderous. Muito obrigado  :thumbsup: Era mesmo isso que precisava.

Realmente não faz sentido esse arraylist aparecer nas subclasses pois é algo "geral".

Vocês cá não brincam em serviço... Bem me recomendaram registar-me cá no fórum.

Bem haja!

Share this post


Link to post
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

×
×
  • 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.