Class IntFloatMap
- java.lang.Object
-
- com.badlogic.gdx.utils.IntFloatMap
-
- All Implemented Interfaces:
java.lang.Iterable<IntFloatMap.Entry>
public class IntFloatMap extends java.lang.Object implements java.lang.Iterable<IntFloatMap.Entry>
An unordered map where the keys are unboxed ints and values are unboxed floats. No allocation is done except when growing the table size.This class performs fast contains and remove (typically O(1), worst case O(n) but that is rare in practice). Add may be slightly slower, depending on hash collisions. Hashcodes are rehashed to reduce collisions and the need to resize. Load factors greater than 0.91 greatly increase the chances to resize to the next higher POT size.
Unordered sets and maps are not designed to provide especially fast iteration. Iteration is faster with OrderedSet and OrderedMap.
This implementation uses linear probing with the backward shift algorithm for removal. Hashcodes are rehashed using Fibonacci hashing, instead of the more common power-of-two mask, to better distribute poor hashCodes (see Malte Skarupke's blog post). Linear probing continues to work even when all hashCodes collide, just more slowly.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
IntFloatMap.Entries
static class
IntFloatMap.Entry
static class
IntFloatMap.Keys
static class
IntFloatMap.Values
-
Constructor Summary
Constructors Constructor Description IntFloatMap()
Creates a new map with an initial capacity of 51 and a load factor of 0.8.IntFloatMap(int initialCapacity)
Creates a new map with a load factor of 0.8.IntFloatMap(int initialCapacity, float loadFactor)
Creates a new map with the specified initial capacity and load factor.IntFloatMap(IntFloatMap map)
Creates a new map identical to the specified map.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
clear()
void
clear(int maximumCapacity)
Clears the map and reduces the size of the backing arrays to be the specified capacity / loadFactor, if they are larger.boolean
containsKey(int key)
boolean
containsValue(float value)
Returns true if the specified value is in the map.boolean
containsValue(float value, float epsilon)
Returns true if the specified value is in the map.void
ensureCapacity(int additionalCapacity)
Increases the size of the backing array to accommodate the specified number of additional items / loadFactor.IntFloatMap.Entries
entries()
Returns an iterator for the entries in the map.boolean
equals(java.lang.Object obj)
int
findKey(float value, float epsilon, int notFound)
Returns the key for the specified value, or notFound if it is not in the map.int
findKey(float value, int notFound)
Returns the key for the specified value, or notFound if it is not in the map.float
get(int key, float defaultValue)
float
getAndIncrement(int key, float defaultValue, float increment)
Returns the key's current value and increments the stored value.int
hashCode()
boolean
isEmpty()
Returns true if the map is empty.java.util.Iterator<IntFloatMap.Entry>
iterator()
IntFloatMap.Keys
keys()
Returns an iterator for the keys in the map.boolean
notEmpty()
Returns true if the map has one or more items.protected int
place(int item)
Returns an index >= 0 and <=mask
for the specifieditem
.void
put(int key, float value)
float
put(int key, float value, float defaultValue)
Returns the old value associated with the specified key, or the specified default value.void
putAll(IntFloatMap map)
float
remove(int key, float defaultValue)
Returns the value for the removed key, or the default value if the key is not in the map.void
shrink(int maximumCapacity)
Reduces the size of the backing arrays to be the specified capacity / loadFactor, or less.java.lang.String
toString()
IntFloatMap.Values
values()
Returns an iterator for the values in the map.
-
-
-
Field Detail
-
size
public int size
-
shift
protected int shift
Used byplace(int)
to bit shift the upper bits of along
into a usable range (>= 0 and <=mask
). The shift can be negative, which is convenient to match the number of bits in mask: if mask is a 7-bit number, a shift of -7 shifts the upper 7 bits into the lowest 7 positions. This class sets the shift > 32 and < 64, which if used with an int will still move the upper bits of an int to the lower bits due to Java's implicit modulus on shifts.mask
can also be used to mask the low bits of a number, which may be faster for some hashcodes, ifplace(int)
is overridden.
-
mask
protected int mask
A bitmask used to confine hashcodes to the size of the table. Must be all 1 bits in its low positions, ie a power of two minus 1. Ifplace(int)
is overriden, this can be used instead ofshift
to isolate usable bits of a hash.
-
-
Constructor Detail
-
IntFloatMap
public IntFloatMap()
Creates a new map with an initial capacity of 51 and a load factor of 0.8.
-
IntFloatMap
public IntFloatMap(int initialCapacity)
Creates a new map with a load factor of 0.8.- Parameters:
initialCapacity
- The backing array size is initialCapacity / loadFactor, increased to the next power of two.
-
IntFloatMap
public IntFloatMap(int initialCapacity, float loadFactor)
Creates a new map with the specified initial capacity and load factor. This map will hold initialCapacity items before growing the backing table.- Parameters:
initialCapacity
- The backing array size is initialCapacity / loadFactor, increased to the next power of two.
-
IntFloatMap
public IntFloatMap(IntFloatMap map)
Creates a new map identical to the specified map.
-
-
Method Detail
-
place
protected int place(int item)
Returns an index >= 0 and <=mask
for the specifieditem
.The default implementation uses Fibonacci hashing on the item's
Object.hashCode()
: the hashcode is multiplied by a long constant (2 to the 64th, divided by the golden ratio) then the uppermost bits are shifted into the lowest positions to obtain an index in the desired range. Multiplication by a long may be slower than int (eg on GWT) but greatly improves rehashing, allowing even very poor hashcodes, such as those that only differ in their upper bits, to be used without high collision rates. Fibonacci hashing has increased collision rates when all or most hashcodes are multiples of larger Fibonacci numbers (see Malte Skarupke's blog post).This method can be overriden to customizing hashing. This may be useful eg in the unlikely event that most hashcodes are Fibonacci numbers, if keys provide poor or incorrect hashcodes, or to simplify hashing if keys provide high quality hashcodes and don't need Fibonacci hashing:
return item.hashCode() & mask;
-
put
public void put(int key, float value)
-
put
public float put(int key, float value, float defaultValue)
Returns the old value associated with the specified key, or the specified default value.- Parameters:
defaultValue
-Float.NaN
can be used for a value unlikely to be in the map.
-
putAll
public void putAll(IntFloatMap map)
-
get
public float get(int key, float defaultValue)
- Parameters:
defaultValue
-Float.NaN
can be used for a value unlikely to be in the map.
-
getAndIncrement
public float getAndIncrement(int key, float defaultValue, float increment)
Returns the key's current value and increments the stored value. If the key is not in the map, defaultValue + increment is put into the map and defaultValue is returned.
-
remove
public float remove(int key, float defaultValue)
Returns the value for the removed key, or the default value if the key is not in the map.- Parameters:
defaultValue
-Float.NaN
can be used for a value unlikely to be in the map.
-
notEmpty
public boolean notEmpty()
Returns true if the map has one or more items.
-
isEmpty
public boolean isEmpty()
Returns true if the map is empty.
-
shrink
public void shrink(int maximumCapacity)
Reduces the size of the backing arrays to be the specified capacity / loadFactor, or less. If the capacity is already less, nothing is done. If the map contains more items than the specified capacity, the next highest power of two capacity is used instead.
-
clear
public void clear(int maximumCapacity)
Clears the map and reduces the size of the backing arrays to be the specified capacity / loadFactor, if they are larger.
-
clear
public void clear()
-
containsValue
public boolean containsValue(float value)
Returns true if the specified value is in the map. Note this traverses the entire map and compares every value, which may be an expensive operation.
-
containsValue
public boolean containsValue(float value, float epsilon)
Returns true if the specified value is in the map. Note this traverses the entire map and compares every value, which may be an expensive operation.
-
containsKey
public boolean containsKey(int key)
-
findKey
public int findKey(float value, int notFound)
Returns the key for the specified value, or notFound if it is not in the map. Note this traverses the entire map and compares every value, which may be an expensive operation.
-
findKey
public int findKey(float value, float epsilon, int notFound)
Returns the key for the specified value, or notFound if it is not in the map. Note this traverses the entire map and compares every value, which may be an expensive operation.
-
ensureCapacity
public void ensureCapacity(int additionalCapacity)
Increases the size of the backing array to accommodate the specified number of additional items / loadFactor. Useful before adding many items to avoid multiple backing array resizes.
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
iterator
public java.util.Iterator<IntFloatMap.Entry> iterator()
- Specified by:
iterator
in interfacejava.lang.Iterable<IntFloatMap.Entry>
-
entries
public IntFloatMap.Entries entries()
Returns an iterator for the entries in the map. Remove is supported.If
Collections.allocateIterators
is false, the same iterator instance is returned each time this method is called. Use theIntFloatMap.Entries
constructor for nested or multithreaded iteration.
-
values
public IntFloatMap.Values values()
Returns an iterator for the values in the map. Remove is supported.If
Collections.allocateIterators
is false, the same iterator instance is returned each time this method is called. Use theIntFloatMap.Entries
constructor for nested or multithreaded iteration.
-
keys
public IntFloatMap.Keys keys()
Returns an iterator for the keys in the map. Remove is supported.If
Collections.allocateIterators
is false, the same iterator instance is returned each time this method is called. Use theIntFloatMap.Entries
constructor for nested or multithreaded iteration.
-
-