Class IntSet
- All Implemented Interfaces:
Serializable
public class IntSet extends Object implements Serializable
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, OrderedMap, and for primitive-valued keys, IntIntOrderedMap and IntDoubleOrderedMap.
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.
This class is based on libGDX 1.9.11-SNAPSHOT's IntSet class, and fully replaces the older ShortSet class within
SquidLib's usage. Porting older code that uses ShortSet should be a little easier due to the addAll(short[])
and random(IRNG)
methods. ShortSet used the somewhat-problematic cuckoo-hashing technique, where this uses
the more standard linear probing (like OrderedSet
).
- Author:
- Nathan Sweet, Tommy Ettinger
- See Also:
- Serialized Form
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
IntSet.IntSetIterator
-
Field Summary
-
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
Modifier and Type Method Description boolean
add(int key)
Returns true if the key was not already in the set.void
addAll(int... array)
void
addAll(int[] array, int offset, int length)
void
addAll(short[] array)
void
addAll(short[] array, int offset, int length)
void
addAll(IntSet set)
void
addAll(IntVLA array)
void
addAll(IntVLA array, int offset, int length)
IntVLA
appendInto(IntVLA array)
Appends to an existing (non-null)IntVLA
with all the int items in this IntSet.void
clear()
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.boolean
contains(int key)
void
ensureCapacity(int additionalCapacity)
Increases the size of the backing array to accommodate the specified number of additional items / loadFactor.boolean
equals(Object obj)
int
first()
int
hashCode()
boolean
isEmpty()
Returns true if the set is empty.IntSet.IntSetIterator
iterator()
Returns an iterator for the keys in the set.boolean
notEmpty()
Returns true if the set has one or more items.protected int
place(int item)
Returns an index between 0 (inclusive) andmask
(inclusive) for the specifieditem
.int
random(IRNG rng)
Gets a random int from this IntSet, using the givenIRNG
to generate random values.boolean
remove(int key)
Returns true if the key was removed.void
shrink(int maximumCapacity)
Reduces the size of the backing arrays to be the specified capacity / loadFactor, or less.int[]
toArray()
Allocates a new in array and fills it with the contents of this IntSet.int[]
toArray(int[] array)
Fills an existing (non-null) int array with as many items from this IntSet as will fit in the array, until either the array is full or the IntSet has no more items to offer.String
toString()
static IntSet
with(int... array)
static IntSet
with(IntVLA array)
-
Field Details
-
size
-
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
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 Details
-
IntSet
public IntSet()Creates a new set with an initial capacity of 51 and a load factor of 0.8. -
IntSet
Creates a new set with a load factor of 0.8.- Parameters:
initialCapacity
- If not a power of two, it is increased to the next nearest power of two.
-
IntSet
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
- If not a power of two, it is increased to the next nearest power of two.
-
IntSet
Creates a new set identical to the specified set.
-
-
Method Details
-
place
Returns an index between 0 (inclusive) andmask
(inclusive) 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;
-
add
Returns true if the key was not already in the set. -
addAll
-
addAll
-
addAll
-
addAll
-
addAll
-
addAll
-
addAll
-
remove
Returns true if the key was removed. -
notEmpty
Returns true if the set has one or more items. -
isEmpty
Returns true if the set is empty. -
shrink
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
Clears the set and reduces the size of the backing arrays to be the specified capacity / loadFactor, if they are larger. -
clear
-
contains
-
first
-
random
Gets a random int from this IntSet, using the givenIRNG
to generate random values. If this IntSet is empty, throws an UnsupportedOperationException. This method operates in linear time, unlike the random item retrieval methods inOrderedSet
andOrderedMap
, which take constant time. -
ensureCapacity
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
-
equals
-
toString
-
iterator
Returns an iterator for the keys in the set. Remove is supported.The same iterator instance is returned each time this method is called. Use the
IntSet.IntSetIterator
constructor for nested or multithreaded iteration. -
with
-
with
-
toArray
Allocates a new in array and fills it with the contents of this IntSet.- Returns:
- a new int array containing all the int items of this IntSet.
-
toArray
Fills an existing (non-null) int array with as many items from this IntSet as will fit in the array, until either the array is full or the IntSet has no more items to offer.- Parameters:
array
- a non-null int array; can have a length that is the same as, more than or less thansize
- Returns:
array
, after adding items from this
-
appendInto
Appends to an existing (non-null)IntVLA
with all the int items in this IntSet.- Parameters:
array
- a non-null IntVLA; no items will be removed, and the contents of this will be added at the end- Returns:
array
, after adding items from this
-