package frame.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class MapList implements Iterable { protected List itemList; protected Map itemMap; protected Map indexMap; public MapList() { itemList = new ArrayList(); itemMap = new HashMap(); } public void addAll(Map map) { Set keys = map.keySet(); for (String key: keys) { add(key, map.get(key)); } } public void add(String key, T item) { if (key == null) { return; } key = key.toLowerCase(); itemMap.put(key, item); itemList.add(item); } public void set(String key, T item) { if (key == null) { return; } if (indexMap == null) { indexMap = new HashMap(); } key = key.toLowerCase(); if (!itemMap.containsKey(key)) { itemMap.put(key, item); indexMap.put(key, itemList.size()); itemList.add(item); } else { Integer idx = indexMap.get(key); itemList.set(idx, item); } } public T get(String key) { if (key == null) { return null; } key = key.toLowerCase(); return itemMap.get(key); } public T get(int idx) { return itemList.get(idx); } public T remove(String key) { if (key == null) { return null; } T obj = itemMap.get(key.toLowerCase()); if (obj != null) { itemMap.remove(key); itemList.remove(obj); } return obj; } public List getItemList() { return itemList; } public Set getKeySet() { return itemMap.keySet(); } public boolean isEmpty() { return itemList.isEmpty(); } public int size() { return itemList.size(); } public int mapSize() { return itemMap.size(); } public Iterator iterator() { return itemList.iterator(); } public void clear() { itemList.clear(); itemMap.clear(); } public String toString(String separator) { ContentBuilder builder = new ContentBuilder(separator); for (String key: itemMap.keySet()) { builder.append(key); } return builder.toString(); } public Set keySet() { return itemMap.keySet(); } public boolean equals(MapList another) { if (another == null) { return false; } if (this == another) { return true; } Set keys = itemMap.keySet(); for (String key: keys) { if (!another.contains(key)) { return false; } } Set anotherKeys = another.itemMap.keySet(); for (String anotherKey: anotherKeys) { if (!contains(anotherKey)) { return false; } } return true; } public boolean contains(String key) { if (key == null) { return false; } key = key.toLowerCase(); return itemMap.containsKey(key); } public Object[] toArray() { return itemList.toArray(); } @SuppressWarnings("hiding") public T[] toArray(T[] a) { return itemList.toArray(a); } }