Wpis z mikrobloga

Mirki wiem że rozkręcamy właśnie nową aferę bo z Żubrem wbili się chamko w tło, no ale może ktoś z #java #programowanie jednak będzie w stanie pomóc.
Mam pierwszy raz w życiu ten problem.
Przechowuję dwuwymiarową ArrayListę pewnych obiektów, powiedzmy że wygląda to tak:
ArrayList> I w zasadzie wszystko ok poza tym, że kiedy chcę iterować po obiektach i coś tam na nich robić dostaję ConcurrentModificationException. Cała aplikacja działa w Swingu. Wiem że powinienem synchronizować kolekcję, ale nie bardzo wiem w jaki sposób zrobić to poprawnie.
Kiedy zrobiłem blok synchronizowany:
synchronized(collection) {
...
}
No to dalej dostaję exceptiona. Kiedy zrobię całą metodę jako synchronized to też to samo się dzieje.
Ktoś/coś podpowie jak to ruszyć?
Ewentualnie może zmiana kolekcji na synchronizowaną normalnie z zachowaniem funkcjonalności dodawania/odejmowania ArrayList tak jak tutaj to mam?

#java #programowanie #swing
  • 24
  • Odpowiedz
Na szybko napisane:
Iterator iterator = lista.iterator();
while (iterator.hasNext())
{
final Cos cosTam = iterator.next();
// jakas tam logika
iterator.remove();
  • Odpowiedz
@Wyrewolwerowanyrewolwer: mnie trochę dziwi tworzenie takich list kilku poziomowych, może te array powinno być w jakimś większym obiekcie? Jak np "Sector" zawierający listę Creature, czy nawet sam może ją implementowac(ale w moim przykładzie raczej średnio to poprawne), ale dodatkowo zawiera inne pomocne metody, np cleanCreatures, co robi dokładnie to samo co twój kod ale już na jednej liście, a w głównym kodzie masz tylko for eacha wykonującego tę metodę na
  • Odpowiedz
@GotoFinal:
Każda z klas które dziedziczą po 'Creature' (tzn. no jest tam jakieś dziedziczenie pomiędzy tą i ostatnimi, ale chodzi mi o o ostatnie dziedziczenie) mają jakiś tam priorytet działania i żeby wygodnie mi się iterowało po tym to tworzę listę, która przechowuje listy obiektów o konkretnych priorytetach. Np.
kolekcja.get(0) zwróci listę obiektów o najwyższym priorytecie.
kolekcja.get(1) zwraca mi listę obiektów o drugim najwyższym priorytecie. Itd.
Nie mogę tego pomieszać
  • Odpowiedz
@alosha: Z tym że te obiekty zmieniają swój stan po wykonaniu każdej akcji. No i najbardziej przeszkadza mi problem że rzucany jest wyjątek i blokowane jest całe GUI, ale na spokojnie przemyślałem. Wrzuciłem kod odpowiedzialny za iterację w synchronized (nie bijcie, ma działać, to tylko projekt na uczelnię), odpaliłem na nowym wątku i jest ok.
  • Odpowiedz
@alosha: Nie twierdzę że jest dobrze zaprojektowany. Jeszcze sporo nauki przede mną.
Chcesz powiedzieć że po wykonaniu akcji na obiekcie (np.: zmiana położenia na mapie) miałbym zwracać jego kopię z nowym stanem? Byłoby to dla mnie dość problematyczne przy ustalaniu kolejności ruchu.
  • Odpowiedz
Nie twierdzę że jest dobrze zaprojektowany. Jeszcze sporo nauki przede mną.

Chcesz powiedzieć że po wykonaniu akcji na obiekcie (np.: zmiana położenia na mapie) miałbym zwracać jego kopię z nowym stanem? Byłoby to dla mnie dość problematyczne przy ustalaniu kolejności ruchu.


@Wyrewolwerowanyrewolwer: Już to gdzieś z kimś przerabiałem na wypoku. Pozycja jakiegoś obiektu na torze czy coś... ;-)
W skrócie: obiekt nie ma położenia. Znaczy obiekt gdzieś jest, ale nie jest go świadom. (Tak samo jak stówka w portfelu nie wie, że jest w portfelu, a nie w skarbonce. "Wie", że ma Mieszka I na sobie.)
1. Układ odniesienia: mapa. Mapa się
  • Odpowiedz
@Wyrewolwerowanyrewolwer: pisales o priorytecie, są kolekcje sortujace po priorytecie, lub możesz zaimplementować comparatora.
@alosha: po mojemu to zależy co tworzy, (np gierkę) bo jak chcesz potem szybko i wydajnie zdobywać te lokacje, jeśli nie są one dostępne bezpośrednio z obiektu entity z wydajność poleci na pysk, kiedy takich sprawdzen masz 5000 Na tick, a tickow 100/sec.
W systemach gdzie potrzebna jest wydajnosc, nie można przesadzać z takim podejściem
  • Odpowiedz