Как реализовать отсортированную карту многозначного дерева, которая всегда возвращает ненулевое значение - PullRequest
0 голосов
/ 01 апреля 2020

По соображениям Struts мне нужна отсортированная карта, которая всегда возвращает ненулевое значение.

Для моего конкретного случая у меня есть следующая реализация, и отлично работает :

public class NonEmptyMap extends TreeMap<String, List<MyObject>> {
    @Override
    public List<MyObject> get(Object key) {

        final List<MyObject> result = super.get(key);
        if (result == null) {
            super.put((String) key, new NonEmptyList<MyObject>(MyObject.class));
        }
        return super.get(key);
    }

}

NonEmptyList - это специальная версия списка, которая всегда возвращает ненулевой объект. Например, nonEmptyList.get(2) вызов для nonEmptyList размера 1 будет причиной создания 2 пустых MyObject объектов, вставки их в список и возврата последнего элемента в вызов клиента.

Я хотел бы обобщить реализацию на поддержка любых Key/Value

Есть ли готовые реализации библиотеки?

1 Ответ

0 голосов
/ 01 апреля 2020

Хотя я почти уверен, что ваша реализация списка не будет соответствовать List контракту (т.е. get() должен выдать, если индекс находится вне диапазона (index < 0 || index >= size()), если вы не готовы вернуть MAX_INTEGER из size(), но это может привести к другим неожиданным результатам ...), вы можете использовать пользовательские ListMultimap, используя Multimaps#newListMultimap(Map, Supplier<List>):

static <K extends Comparable<K>, V> ListMultimap<K, V> create(Class<V> valueClass) {
    return Multimaps.newListMultimap(new TreeMap<>(), () -> new NonEmptyList<>(valueClass));
}
...