Tablica int jako klucz HashMap

0

Witam, potrzebuję zrobić HashMape z tablicą int jako klucz i mam problem ponieważ gdy próbuję wyszukać jakąś tablicę w mapie to porównuje referencje. Próbowałem opakować tą tablicę w jakąś klasę i przeciążyć equals ale nic z tego.
Z góry dzieki za pomoc

0

Z zasady używanie obiektów które są mutable jako kluczy to pomysł poroniony. Niemniej jednak mozesz to zrobić tak jak napisałeś -> opakować to sobie w klasę i przeładować dla niej equals i hashCode gdzie będziesz porównywał sobie elementy tablicy. Ale weź pod uwagę że będą się działy cuda jak włożysz coś takiego do mapy a potem zmienisz wartości w tablicy...
Napisz co chcesz osiągnąć, bo myśle że błąd popełniłeś wcześniej...

0

tablice raz włożone do do tej mapy nie będą zmieniane. Muszę zrobić to w hashmapie ponieważ potrzebuje szybkiego wyszukiwania. Ta hashmapa to bedzie tablica przejść do gry kółko i krzyżyk(będą tam zapisywane stany gry i wartosci określonego stanu)

0

No to możesz to zrobić tak jak napisałem wyżej. Twój błąd polegał na tym że przeciązyłeś pewnie tylko equals albo tylko hashCode a wszędzie jest jasno zawsze napisane że MUSISZ przeciązać obie że to działało. Akurat hashCode może tu łatwo napisać skoro to kółko i krzyżyk, bo możesz wyliczać jednoznacznie wartość każdej konfiguracji.

0

A mógłbyś mi mniej więcej podpowiedzieć jak wyliczać ten hashcode bo będzie to się wykonywało kilka tyś. razy na sek i chcę żeby to w miarę szybko działało?
tablica int 0-puste pole 1 i 2 odpowiednio kółko i krzyżyk

0

Tablica dwuwymiarowa jak rozumiem? Wykorzystaj tu cechę kodowania binarnego, tzn traktuj te pola tak jak kolejne bity liczby binarnej. Więc w przypadku planszy 3x3 miałbyś np. pole (0,0) to jest 1, pole (0,1) 2, pole (0,2) to 4, pole (1,0) to 8 itd. W ten sposób uzyskujesz jednoznaczną liczbę poprzez zsumowanie pól gdzie masz kółko. Z krzyżykiem może być dokładnie to samo ale "przesunięte" o maksymalną wartość planszy po prostu. Inty sie nie skończą.

0

a co jak plansza bedzie np 20x20 lub wieksza?

0

To wtedy będziesz miał 2199023255552 możliwości dla takich plansz więc i tak ani tego nie policzysz ani nie przechowasz w pamięci. Obawiam się że źle w ogóle podszedłeś do problemu który chcesz rozwiązać. Bo rozumiem że wpadłeś na genialny pomysł wygenerowania sobie wszystkich możliwych plansz i wyliczenia ruchów raz a potem rozgrywania wielu gier w oparciu o taką tablicę? Przykro mi, ale nic z tego ;] Polecam na przyszłość nie spać na zajeciach z matematyki dyskretnej i teori złożoności obliczeniowej.

0

Az tak szalony to nie jestem :D
Otóż tak. Mam algorytm minimax i on bierze pod uwagę tylko 5 ruchów do przodu i przy pierwszym ruchu analizuje ok 1000000 mozliwości wiec nie jest źle. Dodatkowo przy nastepnych wywolaniach nie bierze wszystkich wolnych pol tylko te kolo ktorych juz jest postawiony jakis znak. Chce zeby zapisywal wlasnie te stany plansz, bo niepotrzebnie przeszukuje te galezie, ktore prowadza do tego samego stanu ale roznymi sekwencjami ruchow

0

No i policzyłeś ile takich mozliwosci będzie dla planszy 20x20 o która pytałeś? Bo chyba nie...

0

Sam tego nie wymyslilem, tu jest to opisane: http://www.cs.put.poznan.pl/amichalski/search/si2006.rgb2pp.pdf(s. 28)
Sam algorytm alpha-beta działający mam tylko chciałem go zoptymalizować tak jak tu jest opisane.

0

A jesteś pewien ze się da? Bo autor proponuje tutaj zapamiętywanie tylko ruchów które już się wykonało co może mieć sens dla szachów czy warcabów, ale dla kółko i krzyżyk zupełnie nie, bo przecież dany stan NIGDY się nie powtórzy. Jaki więc sens?

Ale wracając do naszej zagwostki: tworzysz nieistniejące problemy :) Moja propozycja z intem byłaby najszybsza, szczególnie gdybyś po policzeniu takiej wartości za zapamiętał ją w tej swojej klasie i potem już tylko zwracał (skoro nie może się taki obiekt już zmienić) zarówno dla hashCode jak i dla equals. Ale skoro mówisz że rozmiar planszy może być większy niż typy liczbowe -> 32 / 64 bity to przecież zawsze możesz generować sobie na przykład stringa ze sklejonych wszystkich pól planszy a potem używać hashCode i equals tego wygenerowanego stringa. Przynajmniej nie będziesz się musiał martwić implementacją tego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1