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