2013-06-16 2 views
0

Мне нужна карта impl, которая будет состоять из уложенных в стек карт, которые я мог бы push() и pop(), и значения были бы «добавлены» или «удалены», если они принадлежат к карте, которую выталкивают/выталкивают. И значения будут искать верх/низ (или, возможно, нижний/верхний).Java: Сложенные (слоистые) карты за интерфейсом карты?

Есть ли существующий имплантат в JDK или в другом месте?

Пример:

  • Стек
    • MAP4
      • Foo => ааа
      • бар => 45
    • map3
      • бар => 22
    • map2
      • Foo => ссс
      • Баз => ууу
    • map1

Для этого get("baz") вернется "uuu", get("foo") вернется "aaa" , size() вернется 3 и т. д. Это похоже на прототипное наследование JavaScript.

one impl Я желаю получить более сложный имп, который на самом деле не будет проходить через все слои каждый раз, когда я вызываю какой-либо метод. Методы чтения будут чаще, чем push()/pop(), поэтому во время этого может быть некоторое предварительное вычисление.

+0

А как бы вы создать «внешние карты " Вот? – fge

+0

В JDK нет встроенной структуры, но было бы довольно легко написать реализацию, используя, скажем, 'LinkedList >' – fge

+0

Вы можете использовать 'LinkedBlockingDeque >', если вам нужен стек быть потокобезопасным –

ответ

0

Вы можете иметь Стек как обертка. Есть карта < 'String, Map> (Строка здесь для названия карты). Выставить push и pop как API. Интересная часть вашего вопроса - определение толчка и поп-музыки? Как будет выглядеть подпись этого метода? На самом деле, не совсем ясно, к чему вы пытаетесь достичь?

0

Итак, в JDK нет такой встроенной структуры, но она может быть реализована с использованием LinkedList, содержащего Map.

LinkedList реализует все три из List, Queue и Deque, может быть, это немного перебор, но ohwell ...

Образец кода будет выглядеть следующим образом; Однако, интерфейс Map не очень слушались (интересно, как вы могли бы сделать .equals() и .hashCode() здесь не даже говорить о .clear()?):

public final class StackedMap<K, V> 
    implements Map<K, V> 
{ 
    private final Map<K, V> NO_MAP = new HashMap<K, V>(); 
    private final LinkedList<Map<K, V>> maps = new LinkedList<>(); 

    private Map<K, V> currentMap = NO_MAP; 

    public void push(Map<K, V> map) 
    { 
     maps.push(map); 
     currentMap = map; 
    } 

    public Map<K, V> pop() 
    { 
     return currentMap = maps.pop(); 
    } 

    @Override 
    public V get(K key) 
    { 
     V ret; 

     for (final Map<K, V> map: maps) 
      if ((ret = map.get(key)) != null) 
       break; 
     return ret; 
    } 

    // etc 
} 

Непроверенные и т.д.

+0

Что касается перехвата 'LinkedList', Java имеет класс' Stack', но в его документации говорится: «Более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализациями, которые следует использовать в предпочтении этому классу " –

+0

@fge, как насчет наличия отношения - это is-a? Я думал, что было бы лучше, если бы у меня возник вопрос – zerocool

+0

Конечно, я могу написать его сам, но я желаю еще более сложного метода, который бы не проходил через все слои каждый раз, когда я вызываю какой-либо метод. Методы чтения будут чаще, чем push()/pop(), поэтому может быть некоторое предварительное вычисление. –