]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Improve handling when a word is not found.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sat, 14 Apr 2018 20:01:36 +0000 (22:01 +0200)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sat, 14 Apr 2018 20:01:36 +0000 (22:01 +0200)
Show the most similar word, instead of always
the following word in the list.
This has the side-effect of ignoring any trailing
dots or other garbage as in issue #80.

src/com/hughes/android/dictionary/engine/Index.java

index 99cdb54a7be407167e90bd0d69ee03222feb8d28..285024afdb0d0e00b5a2aa38aa87af27b3b2da4b 100644 (file)
@@ -305,6 +305,20 @@ public final class Index implements RAFSerializable<Index> {
         return NormalizeComparator.compareWithoutDash(token, entry.normalizedToken(), sortCollator, dict.dictFileVersion);
     }
 
+    private int findMatchLen(final Comparator sortCollator, String a, String b) {
+        int start = 0;
+        int end = Math.min(a.length(), b.length());
+        while (start < end)
+        {
+            int mid = (start + end + 1) / 2;
+            if (sortCollator.compare(a.substring(0, mid), b.substring(0, mid)) == 0)
+                start = mid;
+            else
+                end = mid - 1;
+        }
+        return start;
+    }
+
     public int findInsertionPointIndex(String token, final AtomicBoolean interrupted) {
         token = normalizeToken(token);
 
@@ -352,6 +366,15 @@ public final class Index implements RAFSerializable<Index> {
             }
         }
 
+        // if the word before is the better match, move
+        // our result to it
+        if (start > 0 && start < sortedIndexEntries.size()) {
+            String prev = sortedIndexEntries.get(start - 1).normalizedToken();
+            String next = sortedIndexEntries.get(start).normalizedToken();
+            if (findMatchLen(sortCollator, token, prev) >= findMatchLen(sortCollator, token, next))
+                start--;
+        }
+
         // If we search for a substring of a string that's in there, return
         // that.
         int result = Math.min(start, sortedIndexEntries.size() - 1);