Пример реализации
Вот реализация Guava Multimap нужного вам класса:
Первый недостаток: он должен находиться в пакете com.google.common.collect
,Создатели гуавы в своей бесконечной мудрости создали AbstractSortedSetMultimap
пакет с областью действия.
Я буду использовать это enum
во всех моих примерах:
public enum Color{
RED, BLUE, GREEN
};
Создание класса
Существует шесть конструкторов:
Пусто (используется HashMap
и естественный порядок значений)
SortedSetMultimap<Color,String> simple =
new EnumValueSortMultiMap<Color, String>();
с Comparator(V)
(для значений используется HashMap<K,SortedSet<V>>
с предоставленным компаратором)
SortedSetMultimap<Color,String> inreverse =
new EnumValueSortMultiMap<Color, String>(
Ordering.natural().reverse()
);
с Map<K,SortedSet<V>>
(используйте это, если вы хотите отсортировать ключи, передайте SortedMap
реализация)
SortedSetMultimap<Color,String> withSortedKeys =
new EnumValueSortMultiMap<Color, String>(
new TreeMap<Color, Collection<String>>()
);
с Map<K,SortedSet<V>>
и Comparator<V>
(то же, что и выше, но значения отсортированы с помощью пользовательского компаратора)
SortedSetMultimap<Color,String> reverseWithSortedKeys =
new EnumValueSortMultiMap<Color, String>(
new TreeMap<Color, Collection<String>>(),
Ordering.natural().reverse()
);
с Class<K extends Enum<K>>
(использует EnumMap
для большей эффективности, естественное упорядочение значений)
SortedSetMultimap<Color,String> withEnumMap =
new EnumValueSortMultiMap<Color, String>(
Color.class
);
с Class<K extends Enum<K>>
иComparator<V>
(то же, что и выше, но значения отсортированы с помощью пользовательского компаратора)
SortedSetMultimap<Color,String> reverseWithEnumMap =
new EnumValueSortMultiMap<Color, String>(
Color.class, Ordering.natural().reverse()
);
Исходный код
Вот класс:
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);
}
}
Другие способы сделать это
ОБНОВЛЕНИЕ: Полагаю, правильный способ сделать это на Гуаве был бы примерно таким (он использует класс SortedArrayList
, который я написал в моем другом ответе ):
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>();
}
}
);
}