Dictionary keys that exist but can't be found

Martin McClure martin at hand2mouse.com
Thu Apr 11 01:36:41 UTC 2002

At 9:23 PM -0400 4/10/02, Chris Becker wrote:
>Hi all,
>I've been running into problems with a Dictionary whose keys are of the
>class Point. When I attempt to locate certain keys with the "at:" method, it
>fails to find them even though inspection shows they are clearly present.
>Everything seems to work fine until the dictionary grows in size, and then
>certain keys can no longer be found using "at:". I sent "keys inspect" to
>the dictionary and found nil keys sprinkled throughout, then went digging
>and found where Dictionary "at:" uses "findElementOrNil:", and this method
>stops searching when it hits a nil key.
>I've had this problem with the Dictionary class before using a class that I
>created as the key. Are there any caveats with this class I may not be aware

The most common cause of this kind of thing is: If your key changes 
its hash after it is added to a Dictionary (or Set, or any hashed 
collection) it will no longer be found, because the Dictionary will 
be looking in the wrong place.

The hash of a Point is computed based on its X and Y values. Make 
sure you aren't changing the X and Y values of your Points (I doubt 
you are, it's not that easy to do, but if you are changing them, 
that's the problem).

The Array inside a Dictionary normally contains many nils, and they 
are interspersed among the live keys. This is because the position 
that an element has in this array depends on its hash.


More information about the Squeak-dev mailing list