Implementation example
Here is the implementation of Guava Multimap for the class you need:
First downside: it will have to be in the package com.google.common.collect . The guava creators in their infinite wisdom made AbstractSortedSetMultimap batch coverage.
I will use this enum in all my examples:
public enum Color{ RED, BLUE, GREEN };
Class building
There are six constructors:
Empty (uses HashMap and natural ordering for values)
SortedSetMultimap<Color,String> simple = new EnumValueSortMultiMap<Color, String>();
with Comparator(V) (uses a HashMap<K,SortedSet<V>> with the attached comparator for values)
SortedSetMultimap<Color,String> inreverse = new EnumValueSortMultiMap<Color, String>( Ordering.natural().reverse() );
with Map<K,SortedSet<V>> (use this if you want to sort keys, pass the implementation of SortedMap )
SortedSetMultimap<Color,String> withSortedKeys = new EnumValueSortMultiMap<Color, String>( new TreeMap<Color, Collection<String>>() );
with Map<K,SortedSet<V>> and a Comparator<V> (same as above, but values are sorted using a custom comparator)
SortedSetMultimap<Color,String> reverseWithSortedKeys = new EnumValueSortMultiMap<Color, String>( new TreeMap<Color, Collection<String>>(), Ordering.natural().reverse() );
with Class<K extends Enum<K>> (uses EnumMap internally for greater efficiency, natural order of values)
SortedSetMultimap<Color,String> withEnumMap = new EnumValueSortMultiMap<Color, String>( Color.class );
with Class<K extends Enum<K>> and a Comparator<V> (same as above, but values are sorted using a custom comparator)
SortedSetMultimap<Color,String> reverseWithEnumMap = new EnumValueSortMultiMap<Color, String>( Color.class, Ordering.natural().reverse() );
Source
Here's the class:
package com.google.common.collect; import java.util.Collection; import java.util.Comparator; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; public class EnumValueSortMultiMap<K extends Enum<K>, V extends Comparable<? super V>> extends AbstractSortedSetMultimap<K, V>{ private static final long serialVersionUID = 5359491222446743952L; private Comparator<? super V> comparator; private Class<K> enumType; public EnumValueSortMultiMap(){ this(new HashMap<K, Collection<V>>()); } public EnumValueSortMultiMap(final Comparator<? super V> comparator){ this(new HashMap<K, Collection<V>>(), comparator); } public EnumValueSortMultiMap(final Map<K, Collection<V>> map){ this(map, Ordering.natural()); } public EnumValueSortMultiMap(final Map<K, Collection<V>> map, final Comparator<? super V> comparator){ super(map); this.comparator = comparator; } public EnumValueSortMultiMap(final Class<K> enumClass, final Comparator<? super V> comparator){ this(new EnumMap<K, Collection<V>>(enumClass), comparator); } public EnumValueSortMultiMap(final Class<K> enumClass){ this(new EnumMap<K, Collection<V>>(enumClass)); } @Override Map<K, Collection<V>> backingMap(){ return new EnumMap<K, Collection<V>>(enumType); } @Override public Comparator<? super V> valueComparator(){ return comparator; } @Override SortedSet<V> createCollection(){ return new TreeSet<V>(comparator); } }
Other ways to do it
UPDATE: I think the correct way for Guava to do this would be something like this (it uses the SortedArrayList class, which I wrote in my other answer ):
public static <E extends Enum<E>, V> Multimap<E, V> getMap( final Class<E> clz){ return Multimaps.newListMultimap( Maps.<E, Collection<V>> newEnumMap(clz), new Supplier<List<V>>(){ @Override public List<V> get(){ return new SortedArrayList<V>(); } } ); }
Sean Patrick Floyd
source share