/* 
 * @(#)DualKeyHashMap.java  1.0 May 5, 2008 
 * 
 *  The MIT License 
 * 
 *  Copyright (c) 2008 Malachi de AElfweald <[email protected]> 
 * 
 *  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(); 
} 
 
    
     
     
     
     
     
   |     
 
 |