Skip to content

Commit

Permalink
Use CircularFifoBuffer instead of LinkedList in algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
Jakub-Izbicki committed Oct 19, 2018
1 parent 797902e commit f096cfc
Showing 1 changed file with 10 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import java.util.LinkedList;
import java.util.function.Supplier;
import org.apache.commons.collections.buffer.CircularFifoBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -33,24 +34,23 @@ public class Sampler {
* @param samplingPeriod milliseconds period between taking each sample,
* @param sampleQueueSize defines the last n elements that are to be compared,
* @param maxSamplesThreshold max number of samples before return
* @return true if pattern is empty or if its match with given value, false otherwise
* @return last collected sample
*/
public static <T> T waitForValue(Supplier<T> samplesSupplier, int samplingPeriod,
int sampleQueueSize, int maxSamplesThreshold) {
LinkedList<T> samplesQueue = new LinkedList<>();
CircularFifoBuffer samplesQueue = new CircularFifoBuffer(sampleQueueSize);

int samplesTaken = 0;
while (!isThresholdReached(samplesTaken, maxSamplesThreshold) &&
!areAllSamplesEqual(samplesQueue, sampleQueueSize)) {
!areAllSamplesEqual(samplesQueue)) {

CurrentThread.sleep(samplingPeriod);

T nextSample = samplesSupplier.get();
removeLast(samplesQueue, sampleQueueSize);
samplesQueue.addFirst(nextSample);
samplesQueue.add(nextSample);
++samplesTaken;
}
return samplesQueue.getFirst();
return (T) samplesQueue.get();
}

private static boolean isThresholdReached(int samplesTaken, int maxSamplesThreshold) {
Expand All @@ -61,18 +61,9 @@ private static boolean isThresholdReached(int samplesTaken, int maxSamplesThresh
return false;
}

private static boolean areAllSamplesEqual(LinkedList<?> samplesQueue, int sampleSize) {
return isQueueFull(samplesQueue, sampleSize) &&
samplesQueue.stream().allMatch(sample -> samplesQueue.get(0).equals(sample));
}

private static boolean isQueueFull(LinkedList<?> samplesQueue, int queueSize) {
return samplesQueue.size() == queueSize;
}

private static <T> void removeLast(LinkedList<T> samplesQueue, int sampleQueueSize) {
if (isQueueFull(samplesQueue, sampleQueueSize)) {
samplesQueue.removeLast();
}
private static boolean areAllSamplesEqual(CircularFifoBuffer samplesQueue) {
return samplesQueue.isFull() &&
samplesQueue.stream().allMatch(sample -> samplesQueue.get() != null &&
samplesQueue.get().equals(sample));
}
}

0 comments on commit f096cfc

Please sign in to comment.