Структура данных Java - PullRequest
       24

Структура данных Java

6 голосов
/ 03 декабря 2010

Мне нужна некоторая структура данных, которую я могу построить из стандартных коллекций или используя гуаву.Так что оно должно быть изменяемым Map<Enum, V>.Где V - довольно интересная структура.

V требования:

  • изменяемый
  • отсортировано компаратором (с разрешающими элементами, такими как сравнение (a, b) == 0) - это необходимо для итераций
  • set (нет таких a и b, что a.equals(b) == true) - необязательно

дополнительное необязательное требованиедля сопоставления

  • ключи должны повторяться в их естественном порядке

, теперь это HashMap<SomeEnum, LinkedList<Entity>> с различными элементами, такими как collections.sort() в коде.

Спасибо.

Ответы [ 4 ]

12 голосов
/ 03 декабря 2010

Пример реализации

Вот реализация 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>();
            }
        }
    );
}
6 голосов
/ 04 декабря 2010

Если дополнительного класса слишком много, вы можете использовать фабричные методы класса Multimaps.

SortedSetMultimap<Color, Entity> set = Multimaps.newSortedSetMultimap(
    new HashMap<Enum, Collection<Entity>>(), 
    new Supplier<TreeSet<Entity>>() {
        @Override
        public TreeSet<Entity> get() {
            return new TreeSet<Entity>(new Comparator<Entity>() {
                @Override
                public int compare(Entity o1, Entity o2) {
                    //TODO implement
                }
            });
        }
});
2 голосов
/ 03 декабря 2010

Вы можете использовать EnumMap вместо текущего HashMap.EnumMap s более эффективны для ключей enum.В гуаве проверьте Multimap [ examples ].

0 голосов
/ 03 декабря 2010

Вам нужна реализация коллекции V, которая используется следующим образом: HashMap . Вышеуказанные требования влияют на V (не Entity). Правильно?

Я думаю, ссылка TreeSet должна полностью удовлетворить ваши потребности:

  • TreeSet реализует интерфейс Set
  • Сортировка по естественному заказу или по индивидуальному заказу
  • Элементы могут быть добавлены и удалены
...