Class IntSet
- java.lang.Object
-
- com.badlogic.gdx.utils.IntSet
-
public class IntSet extends java.lang.ObjectAn unordered set where the items are unboxed ints. 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 classIntSet.IntSetIterator
-
Constructor Summary
Constructors Constructor Description IntSet()Creates a new set with an initial capacity of 51 and a load factor of 0.8.IntSet(int initialCapacity)Creates a new set with a load factor of 0.8.IntSet(int initialCapacity, float loadFactor)Creates a new set with the specified initial capacity and load factor.IntSet(IntSet set)Creates a new set identical to the specified set.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanadd(int key)Returns true if the key was added to the set or false if it was already in the set.voidaddAll(int... array)voidaddAll(int[] array, int offset, int length)voidaddAll(IntArray array)voidaddAll(IntArray array, int offset, int length)voidaddAll(IntSet set)voidclear()voidclear(int maximumCapacity)Clears the set and reduces the size of the backing arrays to be the specified capacity / loadFactor, if they are larger.booleancontains(int key)voidensureCapacity(int additionalCapacity)Increases the size of the backing array to accommodate the specified number of additional items / loadFactor.booleanequals(java.lang.Object obj)intfirst()inthashCode()booleanisEmpty()Returns true if the set is empty.IntSet.IntSetIteratoriterator()Returns an iterator for the keys in the set.booleannotEmpty()Returns true if the set has one or more items.protected intplace(int item)Returns an index >= 0 and <=maskfor the specifieditem.booleanremove(int key)Returns true if the key was removed.voidshrink(int maximumCapacity)Reduces the size of the backing arrays to be the specified capacity / loadFactor, or less.java.lang.StringtoString()static IntSetwith(int... array)
-
-
-
Field Detail
-
size
public int size
-
shift
protected int shift
Used byplace(int)to bit shift the upper bits of alonginto 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.maskcan 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 ofshiftto isolate usable bits of a hash.
-
-
Constructor Detail
-
IntSet
public IntSet()
Creates a new set with an initial capacity of 51 and a load factor of 0.8.
-
IntSet
public IntSet(int initialCapacity)
Creates a new set with a load factor of 0.8.- Parameters:
initialCapacity- The backing array size is initialCapacity / loadFactor, increased to the next power of two.
-
IntSet
public IntSet(int initialCapacity, float loadFactor)Creates a new set with the specified initial capacity and load factor. This set 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.
-
IntSet
public IntSet(IntSet set)
Creates a new set identical to the specified set.
-
-
Method Detail
-
place
protected int place(int item)
Returns an index >= 0 and <=maskfor 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;
-
add
public boolean add(int key)
Returns true if the key was added to the set or false if it was already in the set.
-
addAll
public void addAll(IntArray array)
-
addAll
public void addAll(IntArray array, int offset, int length)
-
addAll
public void addAll(int... array)
-
addAll
public void addAll(int[] array, int offset, int length)
-
addAll
public void addAll(IntSet set)
-
remove
public boolean remove(int key)
Returns true if the key was removed.
-
notEmpty
public boolean notEmpty()
Returns true if the set has one or more items.
-
isEmpty
public boolean isEmpty()
Returns true if the set 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 set 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 set and reduces the size of the backing arrays to be the specified capacity / loadFactor, if they are larger.
-
clear
public void clear()
-
contains
public boolean contains(int key)
-
first
public int first()
-
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:
hashCodein classjava.lang.Object
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equalsin classjava.lang.Object
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
iterator
public IntSet.IntSetIterator iterator()
Returns an iterator for the keys in the set. Remove is supported.If
Collections.allocateIteratorsis false, the same iterator instance is returned each time this method is called. Use theIntSet.IntSetIteratorconstructor for nested or multithreaded iteration.
-
with
public static IntSet with(int... array)
-
-