HashMap из трех элементов без внутренней итерации
-
06-07-2019 - |
Вопрос
Как лучше всего реализовать hashMap из трех элементов? Например, я хотел бы использовать обычный ключ String, но сопоставить его с двумя разными объектами. Идея похожа на список списков, за исключением того, что первый элемент является ключом.
Я пытаюсь избежать итерации по списку (поэтому поведение похоже на хэш-карту). Согласитесь ли вы, единственный способ построить новый класс Кажется, это "HashMap3" объект (с методами get1 (ключ) и get2 (ключ)) был бы полезен. Я не уверен, как это настроить сам.
Как я могу создать коллекцию?
Решение
Если ключ всегда будет сопоставляться с точно двумя объектами, то самый простой способ сделать это - создать класс Pair
, который существует только для хранения двух объектов. Затем вы используете String в качестве ключа и экземпляр Pair
в качестве значения. Однако, если ключ может отображаться на произвольно много объектов, то для IMO лучший способ сделать это - сохранить значение в Map
в виде Collection
некоторого вида. р>
Другие советы
Посмотрите на Google-коллекции Multimap
Коллекция, похожая на карту, но который может связывать несколько значений с одним ключом. Если вы звоните положить (K, V) дважды, с тем же ключом, но разные значения, мультикарта содержит сопоставления от ключа к обоим значения. р>
хэш из хэши возможно?
Я согласен с Эдди, и у меня была похожая проблема только со многими значениями, а не с двумя. Я хотел, чтобы Java ConcurrentHashMap содержал кэш XML документов, извлекаемых из веб-службы, и мне нужно было записывать различные фрагменты информации вместе с XML для поддержки стратегий удаления кэша (например, «Наименее недавно использованный», «Наименее часто используемый»). Р>
Решением было просто определить класс объекта, который содержит эти элементы. Я использовал закрытый вложенный класс внутри своего класса Cache, что-то вроде этого:
private static class CacheEntry
{
private String uri; // Key
private String fetched_xml; // The XML document (main value)
private long put_time;
private long expires_time;
private long size;
private long hits;
private long last_used_time;
}
ConcurrentHashMap был настроен на URI и выглядел так:
private final Map<String, CacheEntry> cache;
[...]
cache = new ConcurrentHashMap<String, CacheEntry>(100, 0.75f, 3);
Этот код добавляет новый XML-документ в кеш:
CacheEntry value = new CacheEntry();
value.fetched_xml(fetched_xml);
value.uri = uri;
value.put_time = System.currentTimeMillis();
value.expires_time = representation.getExpirationDate().getTime();
value.size = bytes_fetched;
value.hits = 0;
value.last_used_time = 0;
cache.put(uri, value);
Редактировать . Если вам нужно сопоставить ключ с списком из n объектов в Java, вы можете поместить эти объекты в java.util.collections.ArrayList и используйте ArrayList в качестве значения Map.