Re: Sort Map on Value
Lew wrote :
Wojtek wrote:
Wait, I need to handle hash collisions. WHat does a Map use for hash
collisions? The object serial number? Anything I can override?
Equality.
Logically, presence in the map is determined by 'hashCode()' to find the
bucket, and 'equals()' to find which item in that bucket list equals the test
object. A 'put()' will put an absent object in the bucket list at the next
available location. According to the Javadocs, a 'SortedMap' such as
'TreeMap' will use a 'compare()' or 'compareTo()' to do the equality
comparison, so such methods must be consistent with 'equals()'.
<http://java.sun.com/javase/6/docs/api/java/util/SortedMap.html>
... the Map interface is defined in terms of the equals operation, but a
sorted map performs all key comparisons using its compareTo (or compare)
method, so two keys that are deemed equal by this method are, from the
standpoint of the sorted map, equal.
Ok, so this should work then:
class PersonMapKey implements Comparable<PersonMapKey>
{
private String ivKey;
private String ivName;
PersonMapKey( String key, String name )
{
super();
ivKey = key;
ivName = name;
}
private String getKey()
{
return ivKey;
}
private String getName()
{
return ivName;
}
@Override
public int hashCode()
{
return ivKey.hashCode();
}
@Override
public boolean equals( Object key )
{
return ivKey.equals( ((PersonMapKey) key).getKey() );
}
@Override
public int compareTo( PersonMapKey personKey )
{
return ivName.compareTo( personKey.getName() );
}
}
....
Person addPerson( String key String name )
{
PersonMapKey mapKey = new PersonMapKey( key, name );
Person person = ivPersonMap.get( mapKey );
if person == null)
{
person = new Person( key, name );
ivPersonMap.put( mapKey, person );
}
return person;
}
--
Wojtek :-)