Доступ к следующим 3 значениям элемента в карте, зная ключ - PullRequest
0 голосов
/ 22 мая 2010

У меня есть java.util.LinkedHashMap с целым числом в качестве ключа и символом в качестве значения.Я знаю ключ элемента, к которому я хочу получить доступ.В дополнение к значению элемента для ключа, я также хочу получить следующие 3 значения элемента, чтобы я мог добавить все 4 значения элемента и сформировать строку с 4 символами.Я прошу что-то вроде того, как мы будем делать в java.util.List.Возможно ли это каким-либо образом на карте / упорядоченной карте?Пожалуйста, предложите любую другую структуру данных, которая может помочь мне достичь этого.Я использую Java 6.

Ответы [ 4 ]

2 голосов
/ 22 мая 2010

java.util.SortedMap имеет методы subMap (fromKey, toKey) и tailMap (fromKey).

Вы можете использовать первый, если вы знаете последний ключ, который вы хотите, но в вашем случае, так как выЕсли вам нужно фиксированное количество элементов, попробуйте

SortedMap<Integer, Character> tail = l.tailMap(yourKey);
int cnt = 0;
List<Char> result = new ArrayList<Character>();
for (Iterator<Entry<Integer, Character>> it = tail.iterator(); it.hasNext() && cnt < 3; cnt++) {
  reasult.add(it.next());
}

Обратите внимание, что если значения карты не являются неизменными, изменения в списке будут отражаться на карте и наоборот, поскольку я добавил ссылкуэлемента в список (во избежание этого необходимо добавить копию объекта в список).

1 голос
/ 22 мая 2010

Карты позволяют получать коллекции для представления как набора ключей, так и набора записей. В этом случае вы хотите получить набор ключей. Сама карта не имеет итератора, но этот набор будет, и вы можете использовать этот итератор для получения значений для следующих 3 ключей.

При этом я не уверен, что LinkedHashMap - лучший выбор для реализации Map. Элементы будут упорядочены по порядку ввода или последнему порядку ссылок, в зависимости от типа LinkedHashMap.

Вы можете использовать TreeMap, который упорядочивает элементы по ключу, используя компаратор.

0 голосов
/ 22 мая 2010

Я не верю, но реализация собственного LinkedHashSet, который может это сделать, займет у вас двадцать минут.

Вам нужны два класса, тривиальный класс узла, который содержит ваш ключ, значение и указатель nextNode, и новый класс "LinkedHashSet".

Помимо стандартных методов получения, ваш класс узла должен реализовывать equals и хеш для делегирования в key.equals и key.hash ...

Ваш LinkedHashSet должен содержать HashSet, указатель на первый узел и несколько вспомогательных методов, чтобы его пользователю никогда не приходилось видеть объекты HashSet или Node (они оба должны быть пакетными, а не публичными).

Просто создайте связанный список, используя ваши узлы так же, как и любой другой связанный список, но в то же время добавьте узел в хэш-карту. Переопределенные методы в Node гарантируют, что значения могут быть найдены на карте, но для добавления вам придется пройти по всему списку, начиная с узла Head, так же, как и с любым связанным списком.

После этого просто реализуйте методы пересылки для добавления, удаления и всего, что вам нужно. Внедрение LinkedHashSet.getNext (item) так же просто, как поиск узла элемента и получение его nextNode, извлечение элемента из следующего узла и его возврат.

Единственное, что немного сложно, для любого поиска, такого как get (item), вам нужно будет реализовать что-то вроде этого (Извините, что у меня нет обобщений):

public Object get(Item item) {
    node=new Node(item);
    hashSet.get(node);
    return node.itemValue();
}

Обратите внимание, что вы должны заключать элемент в узел, даже если это поиск - для правильной работы хешу это потребуется.

Пока я пишу небольшой код, вот код для getNext (item)

public Object getNext(Item item) {
    node=new Node(item);
    hashSet.get(node);
    return node.getNextNode().itemValue();
}

В любом случае, это 20-минутное усилие и очень познавательное - просто сделайте это.

0 голосов
/ 22 мая 2010

LinkedHashMap не предоставляет такой возможности и, к сожалению, использует для своей реализации закрытые внутренние классы и закрытые для пакета методы, поэтому вы ничего не можете сделать в подклассе.* из Apache commons-collection обладает именно той функциональностью, которая вам нужна (унаследованный метод entryAfter()).Жаль, что это небезопасно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...