Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jony17

Duvida em HashMap

Recommended Posts

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

Share this post


Link to post
Share on other sites
mribeiro

Se PecasList = List<String> fazes

c.get(InstanciaCarro).add("NOVA_PEÇA");

Em principio assim funcionará

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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;
        }
}

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
pedro_kispert

Casdio, não precisas de fazer clone nao, o que o Baderaus disse, resolve o que precisas (:

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Baderous

Será algo do género:

for (PecasList pl : this.ofic.values())
                pl.teste();

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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  😳

Share this post


Link to post
Share on other sites
Baderous

Inicializaste o Map antes do put? (não tenho a certeza se é preciso...)

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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%.

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

×

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.