Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Ordered Map

import java.util.AbstractMap; import java.util.AbstractSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; /**  * This is a simple Map implementation backed by a List of Map.Entry objects.   * It has the property that iterators return entries in the order in whick  * they were inserted.  *   * Operations involving searching, including get() and put(), have cost linear   * to the size of the map. In other words, avoid this implementation if your   * Map might get large.  *   * If we could assume Java 1.4+, we'd just use java.util.LinkedHashMap   * instead of this class.  But we can't.  *   * @author Mike Williams  */ public class OrderedMap extends AbstractMap {     private Set _entrySet = new OrderedSet();     public Set entrySet() {         return _entrySet;     }     public Object put(Object key, Object value) {         Entry existingEntry = getEntryWithKey(key);         if (existingEntry == null) {             entrySet().add(new Entry(key, value));             return null;         }         Object previousValue = existingEntry.getValue();         existingEntry.setValue(value);         return previousValue;     }         private Entry getEntryWithKey(Object key) {         Iterator i = entrySet().iterator();         while (i.hasNext()) {             Entry e = (Entry) i.next();             if (eq(e.getKey(), key)) {                 return e;             }         }         return null;     }          static class OrderedSet extends AbstractSet {         private List _elementList = new LinkedList();         public int size() {             return _elementList.size();         }         public Iterator iterator() {             return _elementList.iterator();         }         public boolean add(Object o) {             _elementList.add(o);             return true;         }              }     static class Entry implements Map.Entry {                  Object _key;         Object _value;         public Entry(Object key, Object value) {             _key = key;             _value = value;         }         public Object getKey() {             return _key;         }         public Object getValue() {             return _value;         }         public Object setValue(Object value) {             Object oldValue = _value;             _value = value;             return oldValue;         }         public boolean equals(Object o) {             if (!(o instanceof Map.Entry)) {                 return false;             }             Map.Entry e = (Map.Entry) o;             return eq(_key, e.getKey()) && eq(_value, e.getValue());         }         public int hashCode() {             return ((_key == null) ? 0 : _key.hashCode()) ^                    ((_value == null) ? 0 : _value.hashCode());         }         public String toString() {             return _key + "=" + _value;         }     }     private static boolean eq(Object o1, Object o2) {         return (o1 == null ? o2 == null : o1.equals(o2));     }      }