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
// ===========================================================
}