+ raf.writeInt(startRow);
+ }
+
+ public String toString() {
+ return token + "@" + startRow;
+ }
+}
+
+
+ private TokenRow sortedIndexToToken(final int sortedIndex) {
+ final IndexEntry indexEntry = sortedIndexEntries.get(sortedIndex);
+ return (TokenRow) rows.get(indexEntry.startRow);
+ }
+
+ public TokenRow find(String token, final AtomicBoolean interrupted) {
+ token = sortLanguage.textNorm(token, true);
+
+ int start = 0;
+ int end = sortedIndexEntries.size();
+
+ final Collator sortCollator = sortLanguage.getSortCollator();
+ while (start < end) {
+ final int mid = (start + end) / 2;
+ if (interrupted.get()) {
+ return sortedIndexToToken(mid);
+ }
+ final IndexEntry midEntry = sortedIndexEntries.get(mid);
+
+ final int comp = sortCollator.compare(token, sortLanguage.textNorm(midEntry.token, true));
+ if (comp == 0) {
+ final int result = windBack(token, mid, sortCollator, interrupted);
+ return sortedIndexToToken(result);
+ } else if (comp < 0) {
+// Log.d("THAD", "Upper bound: " + midEntry);
+ end = mid;
+ } else {
+// Log.d("THAD", "Lower bound: " + midEntry);
+ start = mid + 1;
+ }
+ }
+ int result = Math.min(start, sortedIndexEntries.size() - 1);
+ result = windBack(token, result, sortCollator, interrupted);
+ if (result > 0 && sortCollator.compare(sortLanguage.textNorm(sortedIndexEntries.get(result).token, true), token) > 0) {
+ result = windBack(sortLanguage.textNorm(sortedIndexEntries.get(result - 1).token, true), result, sortCollator, interrupted);
+ }
+ return sortedIndexToToken(result);
+ }
+
+ private final int windBack(final String token, int result, final Collator sortCollator, final AtomicBoolean interrupted) {
+ while (result > 0 && sortCollator.compare(sortLanguage.textNorm(sortedIndexEntries.get(result - 1).token, true), token) >= 0) {
+ --result;
+ if (interrupted.get()) {
+ return result;
+ }