Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jony17

Duvida em HashMap

Mensagens Recomendadas

jony17

Boa tarde!

Pode-se fazer alguma do genero:

Map<Carro,PecasList> c = new HashMap<Carro,PecasList>();

Em que Carro é uma classe e PecasList é um arraylist de peças do carro por exemplo ?

Se sim, como é que depois posso, recebendo o carro  e uma peça inserir no hashmap ?

Obrigado, espero que me possam ajudar.

cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
IceBrain

Sorry, mas a lista de peças deveria ser um atributo do carro, não?

 carro1.getPecasList().add(peca); 

Mas se queres como está no código original, acho que precisas de uma Hashtable, não de um HashMap:

Map<Carro,PecasList> c = new Hashtable<Carro,PecasList>();


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Em que Carro é uma classe e PecasList é um arraylist de peças do carro por exemplo ?

Map<Carro, ArrayList<PecaCarro>> c = new HashMap<Carro, ArrayList<PecaCarro>>();

c.get(/*carro*/); //Devolve ArrayList<PecaCarro>
c.put(/*carro*/, new ArrayList<PecaCarro>());//Adiciona lista vazia

ArrayList<PecaCarro> p = new ArrayList<PecaCarro>()
p.add(new PecaCarro());
p.add(new PecaCarro());
p.add(new PecaCarro());

c.put(/*carro*/, p);//Adiciona lista com 3 elementos

Podes usar estruturas com genéricos dentro de outras estruturas ou classes com genéricos sem problemas, desde que tenhas noção do que estás a colocar lá dentro e respeites sempre o tipo. Não sei se existe algum limite no nível de classes com genéricos que podes usar, nunca testei ou pesquisei, e até agora nunca bati num limite.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
casdio

Aproveitando o tópico:

Tenho algo deste género:

public  class Teste{
private int x;
private HashMap<String, Integer> y;

public Teste(Teste cenas){
x=cenas.getX();
y=?;
}
}

Como é que faço no caso da variavel y?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Podes fazer algo deste género:

public class Teste {
        private int x;
        private HashMap<String,Integer> y;
        
        public Teste() { this(0,new HashMap<String,Integer>()); }
        
        public Teste(int x, Map<String,Integer> y) {
            this.x = x;
            this.y = new HashMap<String,Integer>();
            for (String s : y.keySet())
                this.y.put(s,y.get(s));
        }

        public Teste(Teste t) {
                this.x = t.getX();
                Map<String,Integer> n = t.getY();
                for (String s : n.keySet())
                        this.y.put(s,n.get(s));
        }

        public int getX() { return this.x; }
        public Map<String,Integer> getY() {
            Map<String,Integer> m = new HashMap<String,Integer>();
            for (String s : this.y.keySet())
                m.put(s,this.y.get(s));
            return m;
        }
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Podes evitar o ciclo no teu código usando o construtor que recebe um map como entrada

this.y = new HashMap<String,Integer>(y);

Repara que também podes atribuir directamente a variável

this.y = y;

Mas este é um caso pouco recomendado porque se eu alterar a estrutura que usei para passar para o construtor vou destruir os dados do que estão no objecto Teste.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
casdio

E se nao fosse HashMap<String,Integer> mas sim HashMap<Class1,Class2>? Ja prcisava de clone?

Estou com duvidas nas situaçoes em que e preciso e em que nao e...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

As instâncias de Wrapper Classes (classes que "embrulham" tipos primitivos: Float, Double, Boolean, String, etc), são imutáveis, e como tal, não é necessário fazer o seu clone.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jony17

Se me pudessem esclarecer em mais uma duvida agradecia.

Se eu tiver um HashMap<Carro,PecasList>

Em que Pecaslist e um ArrayList.

Como faco para aplicar um metodo a cada membro do arraylist de todos os carros?

public class PecasList {
    private List<Pecas> listaPecas;

    public List<String> teste(){
        List<String> l = new ArrayList<String>();
        for(Pecas p : this.listaPecas){
            if(p.getFunc() == 0)
                l.add(p.getCodigo());
        }
        return l;        
    }

public class Oficina{
    private Map <Carro,PecasList> ofic;

    public List<String> teste2(){
        List<String> l = new ArrayList<String>();
        /** O que tenho que por aqui para aplicar o metodo teste a cada lista de pecas de cada carro ?? */
        return l;                            
    }
}

Espero que de pa entender o que não percebo.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jony17

Num HashMap e possivel criar por exemplo:

HashMap t = new HashMap<Carro,null>();

O que eu queria era criar um Carro sem nenhuma peça para depois poder adicionar. É possivel isso ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Não, para isso crias um construtor da classe PecasList que inicialize o seu ArrayList interno a null ou não tendo nenhum elemento.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jony17

Ja tentei fazer como disseste mas da-me sempre NullPointerException  :)

Na classe de teste tenho isto:

Carro c = new Carro("a","b","c");
PecasList p = new PecasList();
ofic.adicionaCarro(c,p);

E na Oficina:

public void adicionaCarro(Carro c,PecasList pl) {
        this.ofic.put(c,pl);
} 

Nao deveria funcionar ?

Desculpa la estar a ser chato mas nao percebo muito disto  😳

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jony17

Pois, acho que era isso  :)

Onde e como que posso definir uma variável global que vai ser o Map, para depois adiconar e remover Carros ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

aonde tens:

public class Nome{
//Escreves aqui a declaração da variável.
//se for estática escreves assim:
private static HashMap<Class, Class2> name = new HashMap //...;
//se for non-static é:
private HashMap<Class, Class2> name;

E depois no construtor inicializas


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.