Mega Code Archive

 
Categories / Java / Development Class
 

Dual Key Hash Map

/*  * @(#)DualKeyHashMap.java  1.0 May 5, 2008  *  *  The MIT License  *  *  Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>  *  *  Permission is hereby granted, free of charge, to any person obtaining a copy  *  of this software and associated documentation files (the "Software"), to deal  *  in the Software without restriction, including without limitation the rights  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  *  copies of the Software, and to permit persons to whom the Software is  *  furnished to do so, subject to the following conditions:  *  *  The above copyright notice and this permission notice shall be included in  *  all copies or substantial portions of the Software.  *  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  *  THE SOFTWARE.  */ //package org.eoti.util; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class DualKeyHashMap<XKEY, YKEY, VALUE> extends     HashMap<DualKeyMap.DualKey<XKEY, YKEY>, VALUE> implements     DualKeyMap<XKEY, YKEY, VALUE> {   static class SimpleDualKey<XKEY, YKEY> implements DualKey<XKEY, YKEY> {     protected XKEY xKey;     protected YKEY yKey;     public SimpleDualKey(XKEY xKey, YKEY yKey) {       this.xKey = xKey;       this.yKey = yKey;     }     public XKEY getXKey() {       return xKey;     }     public YKEY getYKey() {       return yKey;     }     public int hashCode() {       return toString().hashCode();     }     public boolean equals(Object obj) {       return hashCode() == obj.hashCode();     }     public String toString() {       return String.format("[%s [xkey=%s][ykey=%s]", this.getClass()           .getName(), xKey.toString(), yKey.toString());     }   }   public DualKeyHashMap(int initialCapacity, float loadFactor) {     super(initialCapacity, loadFactor);   }   public DualKeyHashMap(int initialCapacity) {     super(initialCapacity);   }   public DualKeyHashMap() {     super();   }   public DualKeyHashMap(Map<? extends DualKey<XKEY, YKEY>, ? extends VALUE> m) {     super(m);   }   public boolean containsXKey(XKEY xKey) {     for (DualKey<XKEY, YKEY> key : keySet()) {       if (key.getXKey().equals(xKey))         return true;     }     return false;   }   public boolean containsYKey(YKEY yKey) {     for (DualKey<XKEY, YKEY> key : keySet()) {       if (key.getYKey().equals(yKey))         return true;     }     return false;   }   public VALUE get(XKEY xKey, YKEY yKey) {     return super.get(new SimpleDualKey<XKEY, YKEY>(xKey, yKey));   }   public Set<XKEY> getXKeySet() {     HashSet<XKEY> xKeys = new HashSet<XKEY>();     for (DualKey<XKEY, YKEY> key : keySet())       xKeys.add(key.getXKey());     return xKeys;   }   public Set<YKEY> getYKeySet() {     HashSet<YKEY> yKeys = new HashSet<YKEY>();     for (DualKey<XKEY, YKEY> key : keySet())       yKeys.add(key.getYKey());     return yKeys;   }   public VALUE put(XKEY xKey, YKEY yKey, VALUE value) {     return put(new SimpleDualKey<XKEY, YKEY>(xKey, yKey), value);   }   public void putAll(DualKeyMap<XKEY, YKEY, VALUE> map) {     super.putAll(map);   }   public VALUE remove(XKEY xKey, YKEY yKey) {     return remove(new SimpleDualKey<XKEY, YKEY>(xKey, yKey));   } } interface DualKeyMap<XKEY, YKEY, VALUE> extends     Map<DualKeyMap.DualKey<XKEY, YKEY>, VALUE> {   static interface DualKey<XKEY, YKEY> {     public XKEY getXKey();     public YKEY getYKey();     public int hashCode();     public boolean equals(Object obj);   }   // static interface Entry<XKEY,YKEY,VALUE> extends Map.Entry<Key<XKEY,YKEY>,   // VALUE>   // public void clear();   public boolean containsXKey(XKEY xKey);   public boolean containsYKey(YKEY yKey);   // public Set<Entry<XKEY,YKEY,VALUE>> entrySet();   // public boolean equals(Object obj);   public VALUE get(XKEY xKey, YKEY yKey);   // public int hashCode();   // public boolean isEmpty();   public Set<XKEY> getXKeySet();   public Set<YKEY> getYKeySet();   public VALUE put(XKEY xKey, YKEY yKey, VALUE value);   public void putAll(DualKeyMap<XKEY, YKEY, VALUE> map);   public VALUE remove(XKEY xKey, YKEY yKey);   // public int size();   // public Collection<VALUE> values(); }