int (final int index) { if (xdata != getDataModCount()) { // The underlying list was modified somehow... // we need to invalidate our research... xdata = getDataModCount(); backingsize = 0; if (size >= backingpos.length) { backingpos = new int[size + 1]; } } if (index >= 0 && index < backingsize) { // we have already indexed far enough... // return the backing index. return backingpos[index]; } // the index in the backing list of the next value to check. int bpi = 0; if (backingsize > 0) { bpi = backingpos[backingsize - 1] + 1; } while (bpi < size) { final F gotit = filter.filter(elementData[bpi]); if (gotit != null) { backingpos[backingsize] = bpi; if (backingsize++ == index) { return bpi; } } bpi++; } return size; }