Get yer integer to object mappings, cheap!
git-svn-id: https://samskivert.googlecode.com/svn/trunk@1051 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
//
|
||||
// $Id: CheapIntMap.java,v 1.1 2003/02/06 19:57:29 mdb Exp $
|
||||
|
||||
package com.samskivert.util;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* A low overhead hash map using positive integers as keys that is useful
|
||||
* for fast storage and lookup of a small and bounded number of items.
|
||||
*/
|
||||
public class CheapIntMap
|
||||
{
|
||||
/**
|
||||
* Constructs a map that can hold the specified number of items.
|
||||
*/
|
||||
public CheapIntMap (int maxSize)
|
||||
{
|
||||
_keys = new int[maxSize];
|
||||
_values = new Object[maxSize];
|
||||
clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts the specified value into the map. <em>Note:</em> the key
|
||||
* must be a positive integer.
|
||||
*/
|
||||
public void put (int key, Object value)
|
||||
{
|
||||
int size = _keys.length, start = key % size, iidx = -1;
|
||||
for (int ii = 0; ii < size; ii++) {
|
||||
int idx = (ii + start) % size;
|
||||
if (_keys[idx] == key) {
|
||||
_values[idx] = value;
|
||||
return;
|
||||
} else if (iidx == -1 && _keys[idx] == -1) {
|
||||
iidx = idx;
|
||||
}
|
||||
}
|
||||
|
||||
if (iidx != -1) {
|
||||
_keys[iidx] = key;
|
||||
_values[iidx] = value;
|
||||
return;
|
||||
}
|
||||
|
||||
// they booched it!
|
||||
String errmsg = "You fool! You've filled up your cheap int map! " +
|
||||
"[keys=" + StringUtil.toString(_keys) +
|
||||
", values=" + StringUtil.toString(_values) + "]";
|
||||
throw new RuntimeException(errmsg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the object with the specified key, null if no object exists
|
||||
* in the table with that key.
|
||||
*/
|
||||
public Object get (int key)
|
||||
{
|
||||
int size = _keys.length, start = key % size;
|
||||
for (int ii = 0; ii < size; ii++) {
|
||||
int idx = (ii + start) % size;
|
||||
if (_keys[idx] == key) {
|
||||
return _values[idx];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the mapping associated with the specified key. The previous
|
||||
* value of the mapping will be returned.
|
||||
*/
|
||||
public Object remove (int key)
|
||||
{
|
||||
int size = _keys.length, start = key % size;
|
||||
for (int ii = 0; ii < size; ii++) {
|
||||
int idx = (ii + start) % size;
|
||||
if (_keys[idx] == key) {
|
||||
Object value = _values[idx];
|
||||
_keys[idx] = -1;
|
||||
_values[idx] = null;
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears out all mappings from the table.
|
||||
*/
|
||||
public void clear ()
|
||||
{
|
||||
Arrays.fill(_keys, -1);
|
||||
Arrays.fill(_values, null);
|
||||
}
|
||||
|
||||
protected int[] _keys;
|
||||
protected Object[] _values;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
//
|
||||
// $Id: CheapIntMapTest.java,v 1.1 2003/02/06 19:57:29 mdb Exp $
|
||||
|
||||
package com.samskivert.util;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Tests the {@link CheapIntMap} class.
|
||||
*/
|
||||
public class CheapIntMapTest extends TestCase
|
||||
{
|
||||
public CheapIntMapTest ()
|
||||
{
|
||||
super(CheapIntMapTest.class.getName());
|
||||
}
|
||||
|
||||
public void runTest ()
|
||||
{
|
||||
CheapIntMap map = new CheapIntMap(10);
|
||||
|
||||
for (int ii = 0; ii < 100; ii += 20) {
|
||||
map.put(ii, new Integer(ii));
|
||||
}
|
||||
|
||||
for (int ii = 0; ii < 5; ii++) {
|
||||
map.put(ii, new Integer(ii));
|
||||
}
|
||||
|
||||
for (int ii = 0; ii < 100; ii++) {
|
||||
Object val = map.get(ii);
|
||||
if (val != null) {
|
||||
System.out.println(ii + " => " + val);
|
||||
}
|
||||
}
|
||||
|
||||
for (int ii = 0; ii < 100; ii += 20) {
|
||||
System.out.println("Removing " + map.remove(ii));
|
||||
}
|
||||
|
||||
for (int ii = 10; ii > 0; ii--) {
|
||||
map.put(ii, new Integer(ii));
|
||||
}
|
||||
|
||||
for (int ii = 0; ii < 100; ii++) {
|
||||
Object val = map.get(ii);
|
||||
if (val != null) {
|
||||
System.out.println(ii + " => " + val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Test suite ()
|
||||
{
|
||||
return new CheapIntMapTest();
|
||||
}
|
||||
|
||||
public static void main (String[] args)
|
||||
{
|
||||
CheapIntMapTest test = new CheapIntMapTest();
|
||||
test.runTest();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user