/* * ClosedHashOfObjects.java * * Copyright (c) 2010-2011, Ontotext (www.ontotext.com). * * This file is part of GATE (see http://gate.ac.uk/), and is free * software, licenced under the GNU Library General Public License, * Version 2, June 1991 (in the distribution as file licence.html, * and also available at http://gate.ac.uk/gate/licence.html). * * * $Id$ */ package com.ontotext.jape.automaton; /** * This class implements closed hash of elements of type Object. Provides two * methods that could be predefined: equal and getHashCode. It is very * convenient not to predefine the standard java methods equals and hashCode, * but to predefine equal and getHashCode. * * @author petar.mitankin * */ public class ClosedHashOfObjects { protected int[] hash; protected Object[] objects; protected int objectsStored; protected ClosedHashOfObjects() { hash = new int[255]; for (int i = 0; i < hash.length; i++) { hash[i] = Constants.NO; } objects = new Object[256]; } protected int put(Object o) { int i; for (i = getHashCode(o); hash[i] != Constants.NO; i = (i + Constants.hashStep) % hash.length) { if (equal(objects[hash[i]], o)) { return (hash[i]); } } hash[i] = objectsStored; if (objectsStored == objects.length) { Object[] newObjects = new Object[2 * objects.length]; for (i = 0; i < objectsStored; i++) { newObjects[i] = objects[i]; } objects = newObjects; } objects[objectsStored] = o; objectsStored++; if (10 * objectsStored > 9 * hash.length) { hash = new int[2 * hash.length + 1]; for (i = 0; i < hash.length; i++) { hash[i] = Constants.NO; } for (int j = 0; j < objectsStored; j++) { for (i = getHashCode(objects[j]); hash[i] != Constants.NO; i = (i + Constants.hashStep) % hash.length) ; hash[i] = j; } } return (objectsStored - 1); } protected int contains(Object o) { for (int i = getHashCode(o); hash[i] != Constants.NO; i = (i + Constants.hashStep) % hash.length) { if (equal(objects[hash[i]], o)) { return (hash[i]); } } return Constants.NO; } protected int getHashCode(Object o) { return o.hashCode() % objectsStored; } protected boolean equal(Object o1, Object o2) { return o1.equals(o2); } }