public class ComplexKeyExample {
class ItemKey {
String iName;
Object[] iParams;
ItemKey(String iname, Object... params) {
iName = iname;
iParams = params;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((iName == null) ? 0 : iName.hashCode());
result = prime * result + Arrays.hashCode(iParams);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ItemKey other = (ItemKey) obj;
if (iName == null) {
if (other.iName != null)
return false;
} else if (!iName.equals(other.iName))
return false;
if (!Arrays.equals(iParams, other.iParams))
return false;
return true;
}
}
abstract class Item {
ItemKey key;
ItemKey getKey() {
return key;
}
}
class ItemA extends Item{
String iName;
ItemA(int param1, int param2) {
iName = "ItemA";
key = new ItemKey(iName, new Object[] {param1, param2});
}
}
class ItemB extends Item {
String iName;
ItemB(String param1) {
iName = "ItemB";
key = new ItemKey(iName, new Object[] {param1});
}
}
void runExample() {
//init
HashMap<ItemKey, Item> itemsMap = new HashMap<ItemKey, Item>();
Item item = new ItemA(5, 7);
ItemKey key = item.getKey();
itemsMap.put(key, item);
item = new ItemA(5, 9);
key = item.getKey();
itemsMap.put(key, item);
item = new ItemB("wow-item");
key = item.getKey();
itemsMap.put(key, item);
//my task is to be able to get Item objects from hashmap by the key provided
//now I want to get the item I need
key = new ItemKey("ItemA", new Object[] {35, 7});
item = itemsMap.get(key);
if (item == null) {
System.out.println("map size: " + itemsMap.size() + ", key not found");
} else {
System.out.println("map size: " + itemsMap.size() + ", item found by key");
}
//prints not found
key = new ItemKey("ItemB", new Object[] {"wow-item"});
item = itemsMap.get(key);
if (item == null) {
System.out.println("map size: " + itemsMap.size() + ", key not found");
} else {
System.out.println("map size: " + itemsMap.size() + ", item found by key");
}
//prints found
}
}