Usage:
Map<String, Object> myMap = new CaseInsensitiveLinkedHashMap<Object>() Object o1 = new Object(); myMap.put("id7", o1); Object o2 = myMap.get("ID7"); System.out.println(o1==o2 ? "success" : "failure"); // prints "success" // end
It preserves the original capitalization of the keys while maintaining the efficiency of the hash lookups, but the lookups are case insensitive.
Source:
package util; import java.util.*; /** * allows you to create a Map<String, ?> where the String key is case insensitive. * @author Jonathan */ public final class CaseInsensitiveLinkedHashMap<T> implements Map<String, T> { private final Map<String, String> keys; private final Map<String, T> values; public CaseInsensitiveLinkedHashMap() { keys = new LinkedHashMap<String, String>(); values = new LinkedHashMap<String, T>(); } public CaseInsensitiveLinkedHashMap(int initialCapacity) { keys = new LinkedHashMap<String, String>(initialCapacity); values = new LinkedHashMap<String, T>(initialCapacity); } public CaseInsensitiveLinkedHashMap(int initialCapacity, float loadFactor) { keys = new LinkedHashMap<String, String>(initialCapacity, loadFactor); values = new LinkedHashMap<String, T>(initialCapacity, loadFactor); } public CaseInsensitiveLinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { keys = new LinkedHashMap<String, String>(initialCapacity, loadFactor, accessOrder); values = new LinkedHashMap<String, T>(initialCapacity, loadFactor, accessOrder); } public CaseInsensitiveLinkedHashMap(Map<? extends String, ? extends T> initialValues) { this(initialValues.size()); for (Entry<? extends String, ? extends T> entry : initialValues.entrySet()) { put(entry.getKey(), entry.getValue()); } } @Override public boolean containsKey(Object key) { return containsKey(key.toString()); } public boolean containsKey(String key) { return values.containsKey(key.toLowerCase()); } @Override public T get(Object key) { return get(key.toString()); } public T get(String key) { return values.get(key.toLowerCase()); } @Override public T put(String key, T value) { final String lowerCaseKey = key.toLowerCase(); keys.put(lowerCaseKey, key); return values.put(lowerCaseKey, value); } @Override public T remove(Object key) { return remove(key.toString()); } public T remove(String key) { final String lowerCaseKey = key.toLowerCase(); keys.remove(lowerCaseKey); return values.remove(lowerCaseKey); } @Override public void putAll(Map<? extends String, ? extends T> m) { for (Entry<? extends String, ? extends T> entry : m.entrySet()) { put(entry.getKey(), entry.getValue()); } } @Override public void clear() { keys.clear(); values.clear(); } @Override public Set<String> keySet() { return new LinkedHashSet<String>(keys.values()); } @Override public Collection<T> values() { return values.values(); } @Override public Set<Entry<String, T>> entrySet() { Set<Entry<String, T>> set = new LinkedHashSet<Entry<String, T>>(); for (final String keyLowerCase : keys.keySet()) { Entry<String, T> entry = new Entry<String, T>() { final String key = keys.get(keyLowerCase); @Override public String getKey() { return key; } @Override public T getValue() { if (containsKey(key)) { return get(key); } return null; } @Override public T setValue(T value) { return put(key, value); } }; set.add(entry); } return set; } @Override public int size() { return values.size(); } @Override public boolean isEmpty() { return values.isEmpty(); } @Override public boolean containsValue(Object value) { return values.containsValue(value); } } // end