tcms Posted May 15, 2013 at 11:51 AM Report #507445 Posted May 15, 2013 at 11:51 AM (edited) Boas malta, Tenho um Map imagens associadas a objectos, neste caso Map<Image, Object>. E o que quero fazer é, quando acontecer determinada condição a cada Object, ele retira a imagem correspondente da Frame. E fiz isso assim: public void removerInvasor() { for (Images image: Map_Inv.keySet()) { for (Objects object : Map_Inv.values()) { if (objects.getLife() == 0) { Map_Inv.remove(invaders); Ao correr o código, mal um dos objects confirma a condição, o erro é lançado. É possivel contornar isto continuando a usar o Map? Obrigado Edited May 15, 2013 at 08:51 PM by brunoais geshi
nelsonr Posted May 15, 2013 at 11:57 AM Report #507446 Posted May 15, 2013 at 11:57 AM Não te deve deixar mexer no Map_Inv porque está a ser usado no for. Experimenta criares uma lista vazia no inicio para guardares os "invaders" a remover. Em vez do Map_Inv.remove, adicionas esse invader à nova lista. No final de tudo, caso a lista de invaders a remover tenha alguma coisa, chamas o Map_Inv.remove para cada um
tcms Posted May 15, 2013 at 12:25 PM Author Report #507453 Posted May 15, 2013 at 12:25 PM Não te deve deixar mexer no Map_Inv porque está a ser usado no for. Experimenta criares uma lista vazia no inicio para guardares os "invaders" a remover. Em vez do Map_Inv.remove, adicionas esse invader à nova lista. No final de tudo, caso a lista de invaders a remover tenha alguma coisa, chamas o Map_Inv.remove para cada um Obrigado nelson, fiz isso, ficou assim: public void removerInvasor() { List<Invaders> aux = new ArrayList<Invaders>(); List<MovingImage> aux2 = new ArrayList<MovingImage>(); for (Images image : Map_Inv.keySet()) { for (Objects object : Map_Inv.values()) { if (object.getLife() == 0) { aux.add(object); aux2.add(image); index.getDisplayer().remove(aux2.get(aux2.size()-1)); } } } Map_Inv.remove(aux.addAll(aux)); O problema é que basta um atingir a condição e são ambos eliminados da Frame, portanto o problema deverá estar aqui :remove(aux2.get(aux2.size()-1));
tcms Posted May 15, 2013 at 11:00 PM Author Report #507562 Posted May 15, 2013 at 11:00 PM Acabei de testar este, mas o problema agora é que me lança o nosso querido NullPointerExc public void LIVE_teste5(){ Iterator<Image> it = Map_Inv.keySet().iterator(); while (it.hasNext()){ it.next(); if (Map_Inv.get(it).ja_morreu()) it.remove(); } }
eatg75 Posted May 15, 2013 at 11:18 PM Report #507563 Posted May 15, 2013 at 11:18 PM (edited) Porque que estas a utilizar um HashSet se uma lista e resolve o teu problema? Na operacao removerInvasor() estar a utilizar uma ArrayList, atencao que uma array list so e eficaz quando tens uma colecao fixa que prentedents a todo instante aceder a um elemento, ao passo que uma LinkedList e exatamente o oposto da ArrayList permite a insercao e eliminacao de elementos de forma optimizado, mas, aceder ou procurar um elemento e um bocado custuoso. Ajudaria um bocado se disses que excepcoes estao a ser lancadas, ah ja agora estas a remover os elementos de forma assincrona? public void LIVE_teste5() { Iterator<Image> it = Map_Inv.keySet().iterator(); while (it.hasNext()){ it.next(); // errado !! deve ser feita no fim, independentemente do tamanho da HashMap nunca acederas ao primeiro elemento com este // codigo, estas a ter uma especie de [i]off by one[/i] if (Map_Inv.get(it).ja_morreu()) // excepcao esta a ser lancada aqui it.remove(); } } A versao correta seria algo como : public void LIVE_teste5(){ Iterator<Image> it = Map_Inv.keySet().iterator(); while (it.hasNext()) { if (Map_Inv.get(it).ja_morreu()) it.remove(); it.next(); } } EDIT x3 : Alterei a identacao EDIT 2 : Tinha a instrucao it.next(); fora do ciclo while Edited May 16, 2013 at 12:08 AM by eatg75 1 Report Victarion seized the dusky woman by the wrist and pulled her to him. Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see. Moqorro's dark eyes seemed to shine. Moqorro - I see dragons.
tcms Posted May 15, 2013 at 11:48 PM Author Report #507569 Posted May 15, 2013 at 11:48 PM (edited) Ele nesse caso continua a dar-me erro mas penso que o problema está no Map_Inv.get(it).ja_morreu() isto porque eu quero eliminar do Map a Imagem correspondente, e ao fazer get(it) ele não vai dar o index correcto, e daí o nullPointer Em relação ao que disseste, estou a usar um Map, porque cada Imagem tem um objecto associado, e esse objecto tem atributos, como por exemplo a sua vida . E aqui pretendo que ao acontecer determinado condição a esse objecto, a respectiva Image também acontece algo. Dai ter usado o HashMap Edited May 15, 2013 at 11:55 PM by tcms
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now