HashMap из трех элементов без внутренней итерации - PullRequest
1 голос
/ 07 мая 2009

Каков наилучший способ реализации hashMap из трех элементов? Например, я хотел бы использовать обычный ключ String, но сопоставить его с двумя разными объектами. Идея похожа на список списков, за исключением того, что первый элемент является ключом.

Я пытаюсь избежать итерации по списку (поэтому поведение похоже на хэш-карту). Согласитесь ли вы, что единственный способ построить новый класс? Кажется, был бы полезен объект "HashMap3" (с методами get1 (ключ) и get2 (ключ)). Я не уверен, как это настроить сам.

Как мне создать коллекцию?

Ответы [ 4 ]

4 голосов
/ 07 мая 2009

Если ключ всегда отображается на точно два объекта, то самый простой способ сделать это - создать класс Pair, который существует только для хранения двух объектов. Затем вы используете String в качестве ключа и экземпляр Pair в качестве значения. Однако, если ключ может отображаться на произвольное количество объектов, то для IMO лучший способ сделать это - сохранить значение в Map как Collection некоторого вида.

0 голосов
/ 07 мая 2009

Я согласен с Эдди, и у меня была похожая проблема только со многими значениями, а не с двумя. Я хотел, чтобы 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 в качестве значения карты.

0 голосов
/ 07 мая 2009

A хэш хэшей возможно?

0 голосов
/ 07 мая 2009

Посмотрите на Google-коллекции Мультикарта

Коллекция, похожая на карту, но который может связывать несколько значений с одним ключом. Если вы звоните положить (K, V) дважды, с тем же ключом, но разные значения, мультикарта содержит сопоставления от ключа к обоим значения.

...