private static int binarySearchForX(XYDataset data, int series, double x) { // inclusive lo bound, exclusive hi bound int lo = 0, hi = data.getItemCount(series); while (lo < hi) { int mid = (lo + hi) / 2; double midX = data.getXValue(series, mid); if (x < midX) hi = mid; else if (x > midX) lo = mid + 1; else return mid; } return lo; // not found, return index of next date }
public XYDatasetSubdomainAdapter(XYDataset dataset, double loX, double hiX) { super(dataset); this.dataset = dataset; int seriesCount = dataset.getSeriesCount(); this.itemOffsets = new int[seriesCount]; this.itemCounts = new int[seriesCount]; for (int series = 0; series < seriesCount; series++) { int loItem = binarySearchForX(dataset, series, loX); int hiItem = binarySearchForX(dataset, series, hiX); if (hiItem < dataset.getItemCount(series) && hiX == dataset.getXValue(series, hiItem)) hiItem++; // exclusive, so count will be accurate this.itemOffsets[series] = loItem; this.itemCounts[series] = hiItem - loItem; } }