package com.jidesoft.utils; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; public class ActiveCachedArrayList<E> extends ArrayList<E> { private HashMap<Object, Integer> _indexCache; private boolean lazyCache = false; public ActiveCachedArrayList() { this(false); } public ActiveCachedArrayList(boolean inStatus) { this.lazyCache = inStatus; this.recache(); } public ActiveCachedArrayList(Collection<? extends E> c) { super(c); this.recache(); } public ActiveCachedArrayList(int initialCapacity) { super(initialCapacity); this.recache(); } @Override public int indexOf(Object elem) { if (_indexCache == null) { _indexCache = new HashMap(); } Integer o = _indexCache.get(elem); if (o != null) { return o; } else { int i = super.indexOf(elem); _indexCache.put(elem, i); return i; } } @Override public boolean add(E o) { boolean returnB = super.add(o); if (lazyCache) this.invalidateCache(); else this.addCache(o); return returnB; } @Override public void add(int index, E element) { super.add(index, element); if (lazyCache) this.invalidateCache(); else this.recache(); } @Override public E remove(int index) { E returnE = super.remove(index); if (lazyCache) this.invalidateCache(); else this.recache(); return returnE; } @Override public boolean remove(Object o) { boolean returnB = super.remove(o); if (lazyCache) this.invalidateCache(); else this.recache(); return returnB; } @Override public boolean addAll(Collection<? extends E> c) { boolean returnB = super.addAll(c); if (lazyCache) this.invalidateCache(); else this.recache(); return returnB; } @Override public boolean addAll(int index, Collection<? extends E> c) { boolean returnB = super.addAll(index, c); if (lazyCache) this.invalidateCache(); else this.recache(); return returnB; } @Override public E set(int index, E element) { E returnE = super.set(index, element); if (lazyCache) this.invalidateCache(); else this.recache(); return returnE; } @Override public void removeRange(int frontIndex, int toIndex) { super.removeRange(frontIndex, toIndex); if (lazyCache) this.invalidateCache(); else this.recache(); } public void invalidateCache() { _indexCache = null; } public void recache() { _indexCache = new HashMap(); Integer i = 0; for (Object elem : this) { _indexCache.put(elem, i); i++; } } // if value was appended to the end of the cache // add to _indexCache if it is first occurence // if _indexCache already has a value, that means there is an earlier occurence // since ArrayList.indexOf() returns the first occurence, it should return the earlier one public void addCache(E o) { if (_indexCache.get(o) != null) _indexCache.put(o, _indexCache.size()); } public void setLazy(boolean inStatus) { this.lazyCache = inStatus; if (inStatus == false) this.recache(); } }