Jump to content
Sign in to follow this  
PauloM

HashMap

Recommended Posts

PauloM

Olá pessoal.

Sou muito novo nisto do Java pelo que vim cá pedir a vossa ajuda num problema. Antes de mais o código:

Classe Painel de Controlo

import java.io.*;
import javax.swing.JOptionPane;
import java.io.FileNotFoundException;
import java.util.*;
import static java.lang.System.out;
import static java.lang.Math.*;

public class PainelControlo {

public String coordenadas;
ArrayList eventos = new ArrayList();
HashMap<String, artistas> artistas = new HashMap<String, artistas>(); 
Scanner scan = new Scanner(System.in);
public PainelControlo()

{

}


public void criarEvento()
    {
        String nome;
        String tipo;
        String dataInicio;
        String dataFim;
        String nomeArtista;
        
        System.out.print("\fIntroduza o tipo de evento (temporario/eterno): ");
        tipo = scan.nextLine();

            
            if (tipo.equalsIgnoreCase("temporario"))
            { 
                tipo= "temporario";
                System.out.print("Insira o nome do evento: ");
                nome = scan.nextLine();
                System.out.print("\fInsira a data inicial: ");
                dataInicio = scan.nextLine();
                System.out.print("Insira a data final: ");
                dataFim = scan.nextLine();
                System.out.print("\nO evento " + nome + " têm inicio em " + dataInicio + " e acaba em " + dataFim + ".");
                eventos.add(new eventos(tipo, nome, dataInicio, dataFim));

            }
    
            else if (tipo.equalsIgnoreCase("eterno"))
            {
                tipo = "eterno";
                System.out.print("\fInsira o nome do evento: ");
                nome = scan.nextLine();
                System.out.print("\fInsira o nome do artista associado ao evento: ");
                nomeArtista = scan.nextLine();
                System.out.print("\fO evento " + nome + " e um evento do tipo eterno com ");
                eventos.add(new eventos(tipo, nome, nomeArtista));
            
            }
            else
            {
                while ((tipo != "efetivo") || (tipo != "temporario"))
                {
                    JOptionPane.showMessageDialog(null, "O evento tem de ser do tipo temporario ou eterno.", "Erro", JOptionPane.ERROR_MESSAGE );
                    System.out.print("\fInsira o tipo de evento: ");
                    tipo = scan.next();
                }
              
                
            }

            
        }
    
    /**
    /*Visualiza a informação sobre os eventos
     */    
    public void verEventos()
    {
        Iterator verEventos = eventos.iterator();
        eventos evento;
         while (verEventos.hasNext())
        {
            evento = (eventos) verEventos.next();
            System.out.println("\n");
            System.out.println("Nome do Evento:" + evento.getNome());
        
        if (evento.getTipoEvt().equalsIgnoreCase("temporario"))
        {
            System.out.println("Data de Inicio:" + evento.getDataInicio());
            System.out.println("Data de Fim:" + evento.getDataFim());
    }
    }
}
    
public void inserirArtista()
    {
       String nomeArtista;  
       System.out.print("\f Insira o nome do Artista: ");
       nomeArtista = scan.nextLine(); //recebe o nome do artista e passa a linha seguinte
       artistas.put(nomeArtista, new artistas(nomeArtista));// adiciona os artistas a hashmap    }
    

}

Classe Evento

import java.lang.reflect.*;
import javax.swing.JOptionPane;
import java.util.*;
import java.io.*;


public class eventos
{
    String nomeEvt;
    String dataInicio;
    String dataFim;
    String tipoEvt;
    String nomeArtista;
    Scanner scan = new Scanner(System.in);

    public eventos(String tipo, String nome, String dataInicio, String dataFim) //para os eventos temporarios
    {
        tipoEvt = tipo;
        nomeEvt = nome;
        this.dataInicio = dataInicio;
        this.dataFim = dataFim;
    }
    
        public eventos(String tipo, String nome, String nomeArtista) //para os eventos eternos
    {
        tipoEvt = tipo;
        nomeEvt = nome;
        this.nomeArtista = nomeArtista;
    }
    
    
    public String getNome(){
        return nomeEvt;
    }
    
    public String getDataInicio(){
        return dataInicio;
    }
    
    public String getDataFim(){
        return dataFim;
    }
    
    public String getTipoEvt(){
        return tipoEvt;
    }
}

Classe Artistas

import java.lang.reflect.*;
import javax.swing.JOptionPane;
import java.util.*;
import java.io.*;

public class artistas
{
    String nomeArtista;
    HashMap<String, artistas> artistas = new HashMap<String, artistas>(); 
    
    public artistas(String nomeArtista)
    {
        nomeArtista = nomeArtista;
    }
    
    public String getNome(){
        return nomeArtista;
    }            
}

Portanto. Eu já consigo inserir um evento com apenas o nome, se for eterno, e com o nome data de inicio e fim se for temporario. Agora preciso de associar a um evento um determinado artista. Para isso criei uma hasmap artistas<String nome, artistas>. Como é que eu agora consigo associar um determinado artista ao evento? Acho que tem de ser, por exemplo, o utilizador insere um nome artista e o programa vai procurar no hashmap o objecto associado ao nome que o utilizador inseriu e guarda-o no arraylist eventos juntamente com os outros dados.

Não faço a minima ideia de como fazer isto. Podem dar-me umas luzes? Muito obrigado!

Edit: Pensei no seguinte. Ao criar um evento, seria apresentada ao utilizador uma lista com todos os artistas. Ex:

1 - Tony Carreira

2 - Micaela

3 - Ruth Marlene

Com base no numero inserido (1 ou 2 ou 3), o programa iria percorrer a hasmap e devolveria o nome que corresponde a esse numero.

Share this post


Link to post
Share on other sites
Surtr

Mas cada artista pode estar associado a mais do que um evento, digo eu. Podes iterar sobre a os artistas no hashmap usando o o método values() e depois consegues ir buscar as chaves correspondentes usando getKey().

Mais uma coisa, não posso deixar de notar que tens métodos get mas as tuas variáveis de classe são package (valor por omissão), põe-nas como private, respeita o princípio do encapsulamento...

Share this post


Link to post
Share on other sites
PauloM

Obrigado pela resposta.  ;)

Ao ler mais sobre hashmaps percebi que não é suposto lá guardar-se tipos de dados primitivos como o int. Assim decidi usar em vez de uma hashmap um arraylist para guardar o nome dos artistas. São muito mais fáceis de manipular e na realidade só penso lá ter o nome do artista, daí não haver necessidade de usar uma key associado ao nome como seria caso usasse hashmap. O problema agora é outro. Consigo guardar artistas mas o problema é listá-los. o código é muito parecido com o verEventos acima descrito mas dá este erro

java.lang.ClassCastException: java.lang.String cannot be cast to artistas

at PainelControlo.verArtistas(PainelControlo.java:136)

O código é este:

import java.io.*;
import javax.swing.JOptionPane;
import java.io.FileNotFoundException;
import java.util.*;
import static java.lang.System.out;
import static java.lang.Math.*;

public class PainelControlo {

ArrayList arrayEventos = new ArrayList();
ArrayList arrayArtistas = new ArrayList();
Scanner scan = new Scanner(System.in);

public PainelControlo(){

}

public void criarEvento()
    {
        String nome;
        String tipo;
        String dataInicio;
        String dataFim;
        String nomeArtista;
        
        System.out.print("\fIntroduza o tipo de evento (temporario/eterno): ");
        tipo = scan.nextLine();

            
            if (tipo.equalsIgnoreCase("temporario"))
            { 
                tipo= "temporario";
                System.out.print("Insira o nome do evento: ");
                nome = scan.nextLine();
                System.out.print("\fInsira a data inicial: ");
                dataInicio = scan.nextLine();
                System.out.print("Insira a data final: ");
                dataFim = scan.nextLine();
                System.out.print("\nO evento " + nome + " têm inicio em " + dataInicio + " e acaba em " + dataFim + " com coordenadas ");
                arrayEventos.add(new eventos(tipo, nome, dataInicio, dataFim));

            }
    
            else if (tipo.equalsIgnoreCase("eterno"))
            {
                tipo = "eterno";
                System.out.print("\fInsira o nome do evento: ");
                nome = scan.nextLine();
                System.out.print("\fInsira o nome do artista associado ao evento: ");
                nomeArtista = scan.nextLine();
                System.out.print("\fO evento " + nome + " e um evento do tipo eterno com ");
                arrayEventos.add(new eventos(tipo, nome, nomeArtista));
            
            }
            else
            {
                while ((tipo != "efetivo") || (tipo != "temporario"))
                {
                    JOptionPane.showMessageDialog(null, "O evento tem de ser do tipo temporario ou eterno.", "Erro", JOptionPane.ERROR_MESSAGE );
                    System.out.print("\fInsira o tipo de evento: ");
                    tipo = scan.next();
                }
              
                
            }

            
        }
    
    /**
    /*Visualiza a informação sobre os eventos
     */    
    public void verEventos()
    {
        Iterator verEventos = arrayEventos.iterator();
        eventos evento;
         while (verEventos.hasNext())
        {
            evento = (eventos) verEventos.next();
            System.out.println("\n");
            System.out.println("Nome do Evento:" + evento.getNome());
        
        if (evento.getTipoEvt().equalsIgnoreCase("temporario"))
        {
            System.out.println("Data de Inicio:" + evento.getDataInicio());
            System.out.println("Data de Fim:" + evento.getDataFim());
    }
    }
}
    
public void inserirArtista()
    {
       String nomeArtista;
       String opcao;
       System.out.print("\f Insira o nome do Artista: ");
       nomeArtista = scan.nextLine(); //recebe o nome do artista e passa a linha seguinte
       arrayArtistas.add(nomeArtista);// adiciona os artistas a lista_artistas
       System.out.print("\f Deseja inserir mais artistas? (s/n) ");
       opcao = scan.nextLine(); //recebe o nome do artista e passa a linha seguinte
       while (opcao.equalsIgnoreCase("s")){
           System.out.print("\f Insira o nome do Artista: ");
           nomeArtista = scan.nextLine(); //recebe o nome do artista e passa a linha seguinte
           arrayArtistas.add(nomeArtista);// adiciona os artistas a lista_artistas
           System.out.print("\f Deseja inserir mais artistas? (s/n) ");
           opcao = scan.nextLine(); //recebe o nome do artista e passa a linha seguinte
        }
    }
    
public void verArtistas()
{
    Iterator verArtistas = arrayArtistas.iterator();
    artistas artista;   
    while (verArtistas.hasNext())
    {
        artista = (artistas) verArtistas.next();
        System.out.println("Nome do Artista:" + artista.getNomeArtista());
    }
}
}

Já agora, quando falas que tenho de por as variaveis private estas a referir-te as do Painel de Controlo certo?

Share this post


Link to post
Share on other sites
pedrotuga

A mensgem de erro é clara, estás a tentar converter um objecto do tipo string para um objecto do tipo artista, que naturalmente não é possível.

Estás a definir a tua lista arrayArtistas como uma lista de objectos do tipo Object. E estás a meter strings lá para dentro. Isto funciona, ainda que possas fazer melhor.

Só que depois queres pegar nas strings e transforma-las em oobjectos do tipo artista, isso é impossível.

Ou colocas para dentro da lista artistas, ou então vais buscar o nome do artista como sendo uma string, que é o que estás a usar neste momento.

Ou seja, este código não bate a bota com a perdigota, ora olha bem para ele.

ArrayList arrayArtistas = new ArrayList();

//...

nomeArtista = scan.nextLine(); //recebe o nome do artista e passa a linha seguintearrayArtistas.add(nomeArtista);

//...

artista = (artistas) verArtistas.next();
System.out.println("Nome do Artista:" + artista.getNomeArtista());

Se os artistas só têm o nome, então podem perfeitamente se strings. Se tiverem mais que se lhe diga, então cria um objecto para cada um após leres a string do standard input.

De qualquer das formas, deves declarar o tipo de dados da lista usando genéricos. Já os usaste nos hashmaps, pelo que não deve ser um conceito novo para ti...

qq coisa do tipo

ArrayList<String> arrayArtistas = new ArrayList<String>();

Share this post


Link to post
Share on other sites
PauloM

Pessoal muito obrigado pelo vosso tempo e pelas vossas respostas.

Isto tá muito confuso para estes lados. Já consegui o que queria mas fiz batota pelo meio.

Agora quero fazer isto como deve ser. Portanto um artistas pode estar associado a vários eventos e um evento tem pelo menos um artista associado. De que forma é que implemento isto?

Um hasmap?

HashMap<eventos, artistas> evento = new HashMap<eventos, artistas>(); 

Se assim é onde guardo os artistas? Num arraylist?

Share this post


Link to post
Share on other sites
pedrotuga

Isso já estás a entrar na lógica do teu modelo de dados, que não tem necessariamente que ter uma representação única quando estás a executar a tua aplicação.

Começas a precisar de uma base de dados.

Por exemplo... se quiseres obter uma lista só de nomes de artistas, a certa altura criarás um arraylist de strings ou coisa dos estilo

Se quiseres obter uma lista de artistas e os seus espectaculos, usas por exemplo uma lista de objectos do tipo artista em que os espectaculos são um atributo e estão dentro de uma lista  (por cada isntancia) por exemplo.

E por aí fora.

Ou seja, se o teu programa usa os dados de mais que uma forma começas a ter que desenvolver uma forma de guardar os dados e outras formas de os manter em estruturas de dados enquanto os usas da forma que te for mais conveninete.

O que estás a tentar fazer é criar uma estrutura de dados que te sirva para tudo, até é possível, mas começa a ser extremamente inefeciente e a certa altura muito mais trabalhoso.

Share this post


Link to post
Share on other sites
PauloM

Estarei a ir no rumo certo? Alguém me pode dar um feedback sobre este código?

Classe ControlPanel{

HashMap<Event, Artist> listEvents = new HashMap<Event, Artist>();

ArrayList<Artist> arrayArtists = new ArrayList<Artist>();

public void createEvent()
    {
        String name;
        String nameArtist;
        
        System.out.print("Insert the name: ");
        name = scan.nextLine();
        System.out.print("\fInsert the artist associated with this event: \n");
        viewArtists();
        nameArtist = scan.nextLine();

        listEvents.put(new event(name), new artist(nameArtist));

     }

public void createArtist()
    {
       String nameArtist;
       System.out.print("\f Insert the name: ");
       nameArtist = scan.nextLine();
       arrayArtistas.add(new Artist(nameArtist));
    }
    
public void viewArtists()
{
    Iterator viewArtists = arrayArtist.iterator();
    Artist artists;   
    while (verArtistas.hasNext())
    {
        artists = (Artist) viewArtists.next();
        System.out.println("Name: " + artists.getNameArtist());
    }
}
}

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
Sign in to follow this  

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