Java tutorial
/* * @(#)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(); }