Re: Generics for a multiplevalue hashmap
ram@zedat.fu-berlin.de (Stefan Ram) writes:
Alexis Berry <iamrichardjones@gmail.com> writes:
public class MultipleValueHashMap<T, java.util.List<U>> implements Map<T, java.util.List<U>> {
I'd just use:
Multimap<D,V>
For example:
public class Main
{
public static void main( final java.lang.String[] args )
{
final Multimap<java.lang.Integer,java.lang.Integer> m
= new DefaultSetMap<java.lang.Integer,java.lang.Integer>();
m.add( 1, 1 ); m.add( 2, 2 ); m.add( 2, 3 );
java.lang.System.out.println( m ); }}
This prints:
{1=[1], 2=[2, 3]}
Rest of the source code (I suggest to quote only parts one
directly refers to):
interface Container<V>
{ public void add( final V v );
public java.lang.String toString(); }
interface ContainerFactory<V>
{ public Container<V> newContainer(); }
class DefaultContainer<V> implements Container<V>
{ final java.util.Set<V> set;
public DefaultContainer()
{ this.set = new java.util.HashSet<V>(); }
public void add( final V v )
{ this.set.add( v ); }
public java.lang.String toString()
{ return this.set.toString(); }}
class DefaultContainerFactory<V> implements ContainerFactory<V>
{ public DefaultContainer<V> newContainer()
{ return new DefaultContainer<V>(); }}
interface Multimap<D,V>
{ public void add( final D d, final V v );
public java.lang.String toString(); }
class DefaultMultimap<D,V> implements Multimap<D,V>
{ final java.util.Map<D,Container<V>> map;
final ContainerFactory<V> containerFactory;
public DefaultMultimap
( final java.util.Map<D,Container<V>> map,
final ContainerFactory<V> containerFactory )
{ this.map = map;
this.containerFactory = containerFactory; }
public boolean exists( final D d ){ return this.map.containsKey( d ); }
public Container<V> get( final D d ){ return this.map.get( d ); }
public void set( final D d, final Container<V> v )
{ this.map.put( d, v ); }
public void add( final D d, final V v )
{ if( !this.exists( d ))this.set( d, this.containerFactory.newContainer() );
this.get( d ).add( v ); }
public java.lang.String toString()
{ return this.map.toString(); }}
class DefaultSetMap<D,V> implements Multimap<D,V>
{ final Multimap<D,V> multimap;
public DefaultSetMap()
{ this.multimap = new DefaultMultimap<D,V>
( new java.util.HashMap<D,Container<V>>(),
new DefaultContainerFactory<V>() ); }
public void add( final D d, final V v )
{ this.multimap.add( d, v ); }
public java.lang.String toString()
{ return this.multimap.toString(); }}
One can observe that DefaultMultimap<D,V> is defined without any
fixed container for the multiple values of a key. Such a container
is only added in DefaultSetMap<D,V>.