package com.github.pfichtner.jrunalyser.base.comparator;
import java.math.BigDecimal;
import java.util.Comparator;
public class RelDiffNumberComparator implements Comparator<Number> {
private static final BigDecimal ONE_HUNDRED = new BigDecimal(100);
private final BigDecimal maxDiff;
public RelDiffNumberComparator(int i) {
this(new BigDecimal(i));
}
public RelDiffNumberComparator(BigDecimal maxDiff) {
this.maxDiff = maxDiff;
}
@Override
public int compare(Number o1, Number o2) {
BigDecimal diff = new BigDecimal(String.valueOf(o1))
.subtract(new BigDecimal(String.valueOf(o2)));
if (diff.signum() == 0) {
return 0;
}
BigDecimal bd1 = new BigDecimal(String.valueOf(o1));
BigDecimal bd2 = new BigDecimal(String.valueOf(o2));
BigDecimal greater = bd1.abs().compareTo(bd2.abs()) > 0 ? bd1 : bd2;
if (greater.signum() != 0) {
BigDecimal relDiff = diff.multiply(ONE_HUNDRED).divide(greater, 2,
BigDecimal.ROUND_HALF_UP);
if (relDiff.abs().compareTo(this.maxDiff) <= 0)
return 0;
}
return bd1.compareTo(bd2);
}
@Override
public String toString() {
return "RelDiffNumberComparator [maxDiff=" + this.maxDiff + "]";
}
}