package org.andengine.util.adt.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:54:24 - 07.11.2010 */ public class MultiKeyHashMap<K, V> extends HashMap<MultiKey<K>, V> { // =========================================================== // Constants // ========================================================== private static final long serialVersionUID = -6262447639526561122L; // =========================================================== // Fields // =========================================================== // =========================================================== // Constructors // =========================================================== // =========================================================== // Getter & Setter // =========================================================== public V get(final K ... pKeys) { final int hashCode = MultiKey.hash(pKeys); final Iterator<Map.Entry<MultiKey<K>, V>> it = this.entrySet().iterator(); while(it.hasNext()) { final Map.Entry<MultiKey<K>, V> entry = it.next(); final MultiKey<K> entryKey = entry.getKey(); if (entryKey.hashCode() == hashCode && this.isEqualKey(entryKey.getKeys(), pKeys)) { return entry.getValue(); } } return null; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== private boolean isEqualKey(final K[] pKeysA, final K[] pKeysB) { if (pKeysA.length != pKeysB.length) { return false; } else { for (int i = 0; i < pKeysA.length; i++) { final K keyA = pKeysA[i]; final K keyB = pKeysB[i]; if(keyA == null) { if(keyB != null) { return false; } } else { if(!keyA.equals(keyB)) { return false; } } } } return true; } // =========================================================== // Inner and Anonymous Classes // =========================================================== }