in src/main/java/org/apache/commons/collections4/bloomfilter/CellExtractor.java [85:139]
static CellExtractor from(final IndexExtractor indexExtractor) {
return new CellExtractor() {
/**
* Class to track cell values in the TreeMap.
*/
final class CounterCell implements Comparable<CounterCell> {
final int idx;
int count;
CounterCell(final int idx, final int count) {
this.idx = idx;
this.count = count;
}
@Override
public int compareTo(final CounterCell other) {
return Integer.compare(idx, other.idx);
}
}
TreeMap<CounterCell, CounterCell> counterCells = new TreeMap<>();
@Override
public int[] asIndexArray() {
populate();
return counterCells.keySet().stream().mapToInt(c -> c.idx).toArray();
}
private void populate() {
if (counterCells.isEmpty()) {
indexExtractor.processIndices(idx -> {
final CounterCell cell = new CounterCell(idx, 1);
final CounterCell counter = counterCells.get(cell);
if (counter == null) {
counterCells.put(cell, cell);
} else {
counter.count++;
}
return true;
});
}
}
@Override
public boolean processCells(final CellPredicate consumer) {
populate();
for (final CounterCell cell : counterCells.values()) {
if (!consumer.test(cell.idx, cell.count)) {
return false;
}
}
return true;
}
};
}