> mPartition;
private PartitionSizeInformation mPartitionSizeInformation;
/**
* Constructor.
*/
public UnionFindBackedSetOfPairs() {
mUnionFind = new UnionFind<>();
}
/**
* Note: Two calls to this method result in different {@link Pair} objects.
*
* {@inheritDoc}
*/
@Override
public Iterator> iterator() {
if (mPartition == null) {
mPartition = mUnionFind.getAllEquivalenceClasses();
}
final Iterator> iterator = mPartition.iterator();
if (iterator.hasNext()) {
return new PartitionBackedSetOfPairs.IteratorFromPartition<>(iterator);
}
return Collections.emptyIterator();
}
@Override
public void addPair(final E lhs, final E rhs) {
if (mPartition == null) {
mUnionFind.findAndConstructEquivalenceClassIfNeeded(lhs);
mUnionFind.findAndConstructEquivalenceClassIfNeeded(rhs);
mUnionFind.union(lhs, rhs);
} else {
throw new IllegalStateException("final partition already constructed, unable to add new pairs");
}
}
@Override
public boolean containsPair(final E lhs, final E rhs) {
// in same equivalence class if both have same representative
final E lhsRepresentative = mUnionFind.find(lhs);
final E rhsRepresentative = mUnionFind.find(rhs);
return lhsRepresentative.equals(rhsRepresentative);
}
@Override
public Collection> getRelation() {
if (mPartition == null) {
mPartition = mUnionFind.getAllEquivalenceClasses();
}
return mPartition;
}
/**
* @return Size information of the partition.
*/
public PartitionSizeInformation getOrConstructPartitionSizeInformation() {
if (mPartition == null) {
mPartition = mUnionFind.getAllEquivalenceClasses();
}
if (mPartitionSizeInformation == null) {
mPartitionSizeInformation = new PartitionSizeInformation(mPartition);
}
return mPartitionSizeInformation;
}
@Override
public String toString() {
return mUnionFind.toString();
}
@Deprecated
public UnionFind getUnionFind() {
return mUnionFind;
}
}