我目前正在开展一个项目,我想在一些时间内进行测量。为此我正在使用JFreeChart 1.0.13
。
我想创建一个带SimpleHistogramBin
s的直方图,然后将数据添加到这些二进制位。这是代码:
Double min = Collections.min(values);
Double max = Collections.max(values);
Double current = min;
int range = 1000;
double minimalOffset = 0.0000000001;
Double stepWidth = (max-min) / range;
SimpleHistogramDataset dataSet = new SimpleHistogramDataset("");
for (int i = 0; i <= range; i++) {
SimpleHistogramBin bin;
if (i != 0) {
bin = new SimpleHistogramBin(current + minimalOffset, current + stepWidth);
} else {
bin = new SimpleHistogramBin(current, current + stepWidth);
}
dataSet.addBin(bin);
current += stepWidth;
}
for (Double value : values) {
System.out.println(value);
dataSet.addObservation(value);
}
这与Exception in thread "main" java.lang.RuntimeException: No bin.
崩溃起初我认为这是由于在垃圾箱中碰到一个间隙引起的,但是当我开始调试时,错误没有发生。程序运行完毕,我得到了一个情节。然后我补充说:
Thread.sleep(1000);
前
for (Double value : values) {
System.out.println(value);
dataSet.addObservation(value);
}
再次,没有错误。
这让我觉得可能存在某种竞争条件? JFreeChart是否异步添加bin?我希望在任何方向提示我为什么会遇到这种行为。
由于
答案 0 :(得分:3)
如果有人遇到同样的问题,我找到了解决方案:
而不是使用SimpleHistorgramBin
我正在使用HistogramBin
。这基本上将我的代码简化为几行:
HistogramDataset dataSet = new HistogramDataset();
dataSet.setType(HistogramType.FREQUENCY);
dataSet.addSeries("Hibernate", Doubles.toArray(values), 1000);
这种方法会自动创建我需要的垃圾箱,问题就消失了。