package com.google.code.joto.util; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.TreeMap; import org.apache.commons.collections.iterators.IteratorEnumeration; /** * a (simplified) Map, with data duplicated as a fast read-only List, for sequential and indexed traversal * */ public class SortedListTreeMap<K,V> { private TreeMap<K,V> mapData = new TreeMap<K,V>(); private List<V> listData = null; // = Collections.unmodifiableList(new ArrayList<V>()); // ------------------------------------------------------------------------ public SortedListTreeMap() { } // ------------------------------------------------------------------------ private void setDirtyListData() { listData = null; } private void checkCleanListData() { if (listData == null) { listData = Collections.unmodifiableList(new ArrayList<V>(mapData.values())); } } public List<V> valuesAsList() { checkCleanListData(); return listData; } @SuppressWarnings("unchecked") public Enumeration<V> enumeration() { checkCleanListData(); return new IteratorEnumeration(listData.iterator()); } public V getAt(int index) { checkCleanListData(); try { return listData.get(index); } catch(IndexOutOfBoundsException ex) { throw ex; // should not occur!! } } public int indexOf(Object obj) { checkCleanListData(); return listData.indexOf(obj); } // ------------------------------------------------------------------------ public int size() { return mapData.size(); } public V get(Object key) { return mapData.get(key); } public V put(K key, V value) { V res = mapData.put(key, value); setDirtyListData(); return res; } public V remove(K key) { V res = mapData.remove(key); setDirtyListData(); return res; } }