package com.squareup.timessquare; import java.util.LinkedHashMap; import java.util.Map; /** * Take advantage of LinkedHashMap's iterable ordering but also keep track of the indexes and allow * - Fast key lookup by index * - Fast index lookup by key */ class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> { private final Map<Integer, K> indexToKey = new LinkedHashMap<>(); private final Map<K, Integer> keyToIndex = new LinkedHashMap<>(); private int index = 0; @Override public V put(K key, V value) { indexToKey.put(index, key); keyToIndex.put(key, index); index++; return super.put(key, value); } @Override public void clear() { super.clear(); index = 0; indexToKey.clear(); keyToIndex.clear(); } @Override public V remove(Object key) { throw new UnsupportedOperationException("IndexedLinkedHashMap is put/clear only"); } V getValueAtIndex(int index) { return get(indexToKey.get(index)); } int getIndexOfKey(K key) { return keyToIndex.get(key); } }