• 1
  • 2
2019-10-10, 15:18
  #1
Medlem
Despats avatar
Har ett litet problem med en HashMap i Java. Jag har en HashMap som ser ut som detta:
Kod:
private HashMap <CustomClass, ArrayList <CustomClass>> theMap = new HashMap <CustomClass, ArrayList <CustomClass>>(); 
Jag anvnder theMap fr att lagra CustomClass objekt. CustomClass objekt har bara en intressant variabel, vilket r en char [] array. Det r i princip dem som jag vill lagra i HashMappen, men eftersom man inte kan lagra arrays p det sttet i HashMaps pga problem med hashkod (det r iaf vad jag har lst) s skapa jag den hr klassen istllet. I den hr klassen har jag sedan overridat equals och hashCode p detta stt:
Kod:
@Override
public boolean hashCode() {
return Arrays.hashCode(theCharArray);
}

@Override
public boolean equals(Object o) {
if(o == null) return false;
if(this.getClass() != o.getClass()) return false;

CustomClass comp = (CustomClass) o;
return Arrays.equals(this.theCharArray, comp.theCharArray);
 }

Jag har kollat med sprutskrifter, bda metoderna anvnds nr jag frsker "getta" ngot value frn HashMappen via en key, men det funkar nd inte. Stoppar jag in en char [] array som bestr av tecknena 'j', 'a', 'g' i HashMappen och sedan frsker "getta" denna igen s funkar det inte. Vet ngon varfr?
__________________
Senast redigerad av Despat 2019-10-10 kl. 15:21.
Citera
2019-10-10, 15:28
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Despat
Har ett litet problem med en HashMap i Java. Jag har en HashMap som ser ut som detta:
Kod:
private HashMap <CustomClass, ArrayList <CustomClass>> theMap = new HashMap <CustomClass, ArrayList <CustomClass>>(); 
Jag anvnder theMap fr att lagra CustomClass objekt. CustomClass objekt har bara en intressant variabel, vilket r en char [] array. Det r i princip dem som jag vill lagra i HashMappen, men eftersom man inte kan lagra arrays p det sttet i HashMaps pga problem med hashkod (det r iaf vad jag har lst) s skapa jag den hr klassen istllet. I den hr klassen har jag sedan overridat equals och hashCode p detta stt:
Kod:
@Override
public boolean hashCode() {
return Arrays.hashCode(theCharArray);
}

@Override
public boolean equals(Object o) {
if(o == null) return false;
if(this.getClass() != o.getClass()) return false;

CustomClass comp = (CustomClass) o;
return Arrays.equals(this.theCharArray, comp.theCharArray);
 }

Jag har kollat med sprutskrifter, bda metoderna anvnds nr jag frsker "getta" ngot value frn HashMappen via en key, men det funkar nd inte. Stoppar jag in en char [] array som bestr av tecknena 'j', 'a', 'g' i HashMappen och sedan frsker "getta" denna igen s funkar det inte. Vet ngon varfr?
Antar att det r en statshemlighet exakt VAD som inte funkar?

Fr du inte tag p objektet?
Fr du inte tag p rtt objekt?
Ett undantag kastas?
Annat?
Citera
2019-10-10, 16:31
  #3
Medlem
Despats avatar
Citat:
Ursprungligen postat av Proton
Antar att det r en statshemlighet exakt VAD som inte funkar?

Fr du inte tag p objektet?
Fr du inte tag p rtt objekt?
Ett undantag kastas?
Annat?

Jag fr ett nullvrde tillbaka, s get() funkar inte verhuvudtaget
__________________
Senast redigerad av Despat 2019-10-10 kl. 17:30.
Citera
2019-10-10, 18:33
  #4
Medlem
DrVonAnkas avatar
WHOPS, missade en rad.


Vad jag vet s fr du bara null frn en hashmap om det inte finns ett vrde fr den key du kr get p. Hur lgger du till din char array?
__________________
Senast redigerad av DrVonAnka 2019-10-10 kl. 18:43.
Citera
2019-10-10, 19:14
  #5
Medlem
Despats avatar
Citat:
Ursprungligen postat av DrVonAnka
WHOPS, missade en rad.


Vad jag vet s fr du bara null frn en hashmap om det inte finns ett vrde fr den key du kr get p. Hur lgger du till din char array?

Jag anvnder putfunktionen som vanligt, allts put(myChar, MyArrayList) t.ex. Det jag tror problemet r hr r att HashMapen matchar rtt key till rtt plats genom hashCode() och i vanligt fall kan man inte anvnda arrays som keys eftersom tv arrays med exakt samma innehll ger olika hashkod. Vilket oftast r ju inte det man vill ha vilket ocks gller fr mig. Men jag har skapat en CustomClass dr jag har overridat bde hashCode() och equals(Object o) och min HashMap anvnder sig av de metoderna nr den matchar keys. Men det verkar nd inte funka. Arrays.hashCode() r en metod frvrigt som ska p pappret iaf ge samma hashkod till tv arrays med samma innehll. Jag frstr verkligen inte vad som r problemet. Jag har hittat projekt p GitHub som anvnder sig av exakt samma koncept (bokstavligt talat, iofs r de projekten lite ldre ocks) men hr verkar det inte fungera av ngon anledning.
Citera
2019-10-10, 20:07
  #6
Medlem
Citat:
Ursprungligen postat av Despat
Jag anvnder putfunktionen som vanligt, allts put(myChar, MyArrayList) t.ex. Det jag tror problemet r hr r att HashMapen matchar rtt key till rtt plats genom hashCode() och i vanligt fall kan man inte anvnda arrays som keys eftersom tv arrays med exakt samma innehll ger olika hashkod. Vilket oftast r ju inte det man vill ha vilket ocks gller fr mig. Men jag har skapat en CustomClass dr jag har overridat bde hashCode() och equals(Object o) och min HashMap anvnder sig av de metoderna nr p den matchar keys. Men det verkar nd inte funka. Arrays.hashCode() r en metod frvrigt som ska p pappret iaf ge samma hashkod till tv arrays med samma innehll. Jag frstr verkligen inte vad som r problemet. Jag har hittat projekt p GitHub som anvnder sig av exakt samma koncept (bokstavligt talat, iofs r de projekten lite ldre ocks) men hr verkar det inte fungera av ngon anledning.
Om 'get' returnerar null s saknas antingen nyckeln i mappen eller s har du lagt in nyckeln s att den associeras med null. Det r inte s enkelt att du missat att tilldela MyArrayList ett vrde?
Citera
2019-10-10, 21:40
  #7
Medlem
DrVonAnkas avatar
Citat:
Ursprungligen postat av Despat
Jag anvnder putfunktionen som vanligt, allts put(myChar, MyArrayList) t.ex. Det jag tror problemet r hr r att HashMapen matchar rtt key till rtt plats genom hashCode() och i vanligt fall kan man inte anvnda arrays som keys eftersom tv arrays med exakt samma innehll ger olika hashkod. Vilket oftast r ju inte det man vill ha vilket ocks gller fr mig. Men jag har skapat en CustomClass dr jag har overridat bde hashCode() och equals(Object o) och min HashMap anvnder sig av de metoderna nr den matchar keys. Men det verkar nd inte funka. Arrays.hashCode() r en metod frvrigt som ska p pappret iaf ge samma hashkod till tv arrays med samma innehll. Jag frstr verkligen inte vad som r problemet. Jag har hittat projekt p GitHub som anvnder sig av exakt samma koncept (bokstavligt talat, iofs r de projekten lite ldre ocks) men hr verkar det inte fungera av ngon anledning.
Hmm, spnnande. Har du testat att printa om equals() ngonsin returnerar true? Den br vl gra det knns det som dock. Jag kommer inte p ngot annat fr tillfllet.
Citera
2019-10-11, 12:57
  #8
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av Despat
Har ett litet problem med en HashMap i Java. Jag har en HashMap som ser ut som detta:
Kod:
private HashMap <CustomClass, ArrayList <CustomClass>> theMap = new HashMap <CustomClass, ArrayList <CustomClass>>(); 
Jag anvnder theMap fr att lagra CustomClass objekt.
...
Jag har kollat med sprutskrifter, bda metoderna anvnds nr jag frsker "getta" ngot value frn HashMappen via en key, men det funkar nd inte. Stoppar jag in en char [] array som bestr av tecknena 'j', 'a', 'g' i HashMappen och sedan frsker "getta" denna igen s funkar det inte. Vet ngon varfr?
Jag stirrade mig blind p equals/hashCode-delen i detta, som ser ok ut, ett tag innan jag noterade att du antagligen inte har problemet dr. Vid en nrmare titt p theMap ovan, s verkar det som du nog inte tnkt igenom vad du vill lagra i den, fr den ser vldigt skum ut. Speciellt med tanke p det fetade ovan, som inte "riktigt" stmmer i nulget.

Det du nu har deklarerat anvnder allts CustomClass-objekt som nycklar och en lista av CustomClass-objekt som vrden. Med andra ord, varje nyckel pekar ut en lista av objekt som var och en har en char[]. Den mappen knns riktigt mrklig p mnga stt. En nyckel representerad av en viss char[] ger dig allts tillbaka en lista (en ArrayList) nr du frsker hitta saker i mappen, inte ett enskilt CustomClass-objekt. Det lter verkligen inte som det du r ute efter. Varfr skulle ett enskilt CustomClass-objekt anvndas som nyckel? Ingr det objektet (nyckeln) i sig ven unikt i just det vrdet i mappen? Varfr behver du en samling av listor till char[]?

r det inte s enkelt att du egenligen r ute efter en map av typen "HashMap<String, CustomClass>"? Se String som ett exempel hr bara fr en nyckel som r fristende frn vrdet. ven om s inte r fallet tycker jag du skall brja dr och verifiera att din hashCode/equals-impementation fungerar som den skall frst.
Citera
2019-10-11, 13:18
  #9
Medlem
Despats avatar
Citat:
Ursprungligen postat av DieTrolle
Om 'get' returnerar null s saknas antingen nyckeln i mappen eller s har du lagt in nyckeln s att den associeras med null. Det r inte s enkelt att du missat att tilldela MyArrayList ett vrde?
Nope, misstnkte det ocks ett tag men det r inte fallet.

Citat:
Ursprungligen postat av DrVonAnka
Hmm, spnnande. Har du testat att printa om equals() ngonsin returnerar true? Den br vl gra det knns det som dock. Jag kommer inte p ngot annat fr tillfllet.
Aa har testat det.

Citat:
Ursprungligen postat av kjellbrel
Jag stirrade mig blind p equals/hashCode-delen i detta, som ser ok ut, ett tag innan jag noterade att du antagligen inte har problemet dr. Vid en nrmare titt p theMap ovan, s verkar det som du nog inte tnkt igenom vad du vill lagra i den, fr den ser vldigt skum ut. Speciellt med tanke p det fetade ovan, som inte "riktigt" stmmer i nulget.

Det du nu har deklarerat anvnder allts CustomClass-objekt som nycklar och en lista av CustomClass-objekt som vrden. Med andra ord, varje nyckel pekar ut en lista av objekt som var och en har en char[]. Den mappen knns riktigt mrklig p mnga stt. En nyckel representerad av en viss char[] ger dig allts tillbaka en lista (en ArrayList) nr du frsker hitta saker i mappen, inte ett enskilt CustomClass-objekt. Det lter verkligen inte som det du r ute efter. Varfr skulle ett enskilt CustomClass-objekt anvndas som nyckel? Ingr det objektet (nyckeln) i sig ven unikt i just det vrdet i mappen? Varfr behver du en samling av listor till char[]?

r det inte s enkelt att du egenligen r ute efter en map av typen "HashMap<String, CustomClass>"? Se String som ett exempel hr bara fr en nyckel som r fristende frn vrdet. ven om s inte r fallet tycker jag du skall brja dr och verifiera att din hashCode/equals-impementation fungerar som den skall frst.
Jag vill ha en representation av en graf, och det hr r svitt jag vet en bra representation av en adjacency list? Tanken r att objekten i listan som returneras i sin tur ocks sjlva ska finnas som keyvrden i mappen.

Skrev allt detta via mobilen s sorry ifall det r lite otydligt..
Citera
2019-10-11, 18:14
  #10
Medlem
Citat:
Ursprungligen postat av Despat
Nope, misstnkte det ocks ett tag men det r inte fallet.


Aa har testat det.


Jag vill ha en representation av en graf, och det hr r svitt jag vet en bra representation av en adjacency list? Tanken r att objekten i listan som returneras i sin tur ocks sjlva ska finnas som keyvrden i mappen.

Skrev allt detta via mobilen s sorry ifall det r lite otydligt..
Det r ett vanligt stt att representera en graf men har du verkligen tnkt att noderna i grafen ska best av arrayer av tecken?. Jag kan tnka mig problem d detta r anvndbart men det r ganska speciella fall som jag kan komma p och inte ngot som man kanske anvnder i sin frsta graf-lsning.
Fr att terg till ditt problem s kan inte jag hitta ngot fel i hur du har implementerat hashCode och equal. Men som DrVonAnka freslog om att gra utskrifter om equals returnerar true s kan du ven testa att skriva ut vrdet frn Arrays.hashCode() innan du returnerar det. Sedan s kollar du om hashvrdet r lika vid anropet till put som till get.
Men jag tror fortfarande att du missat att skapa MyArrayList tills motsatsen r bevisad i form av kod d variabeln skapas och anvnds i put 🙂
Citera
2019-10-11, 22:43
  #11
Medlem
Om get() returnerar null s ser du till att gra en extra check och returnera false etc.
Citera
2019-10-12, 01:11
  #12
Medlem
DrVonAnkas avatar
Citat:
Ursprungligen postat av AmIMrQ
Om get() returnerar null s ser du till att gra en extra check och returnera false etc.
Hur hjlper det att f false istllet fr null frn get()?

Ts, nr (om?) du kommer p det mste du uppdatera vad felet var. Jag blir galen.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in