int (int physicalIndex) { getValue(); if (myGapPhysicalStarts.length == 0) return physicalIndex; final int bsResult = Arrays.binarySearch(myGapPhysicalStarts, physicalIndex); if (bsResult >= 0) return myGapDisplayStarts[bsResult]; int insertionIndex = -bsResult - 1; //if (insertionIndex == myGapDisplayStarts.length) return getValue().length(); int prevPhysGapStart = insertionIndex > 0 ? myGapPhysicalStarts[insertionIndex - 1] : 0; int prevDisplayGapStart = insertionIndex > 0 ? myGapDisplayStarts[insertionIndex - 1] : 0; if (insertionIndex < myGapDisplayStarts.length) { int prevDisplayGapLength = insertionIndex > 0 ? myGapDisplayStarts[insertionIndex] - myGapDisplayStarts[insertionIndex - 1] : myGapDisplayStarts[0]; if (physicalIndex - prevPhysGapStart > prevDisplayGapLength) return myGapDisplayStarts[insertionIndex]; } return physicalIndex - prevPhysGapStart + prevDisplayGapStart; }