]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/engine/NormalizeComparator.java
Allow caching normalization step of comparator.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / NormalizeComparator.java
index 6583d495d1e3c03c3f240b5ddde7336df5013925..fcd7fc27a95857d201a11790ac642be70fed797e 100644 (file)
 
 package com.hughes.android.dictionary.engine;
 
-import com.ibm.icu.text.Transliterator;
-
 import java.util.Comparator;
 
+import com.ibm.icu.text.Transliterator;
+
 public class NormalizeComparator implements Comparator<String> {
-  
-  final Transliterator normalizer;
-  final Comparator<Object> comparator;
-
-  public NormalizeComparator(final Transliterator normalizer,
-      final Comparator<Object> comparator) {
-    this.normalizer = normalizer;
-    this.comparator = comparator;
-  }
-
-  @Override
-  public int compare(final String s1, final String s2) {
-    final String n1 = normalizer.transform(s1);
-    final String n2 = normalizer.transform(s2);
-    final int cn = comparator.compare(n1, n2);
-    if (cn != 0) {
-      return cn;
+
+    private final Transliterator normalizer;
+    private final Comparator<Object> comparator;
+    private final int version;
+
+    public NormalizeComparator(final Transliterator normalizer,
+                               final Comparator<Object> comparator, int version) {
+        this.normalizer = normalizer;
+        this.comparator = comparator;
+        this.version = version;
+    }
+
+    public static String withoutDash(final String a) {
+        return a.replace("-", "").replace("þ", "th").replace("Þ", "Th");
+    }
+
+    // Handles comparison between items containing "-".
+    // Also replaces other problematic cases like "thorn".
+    public static int compareWithoutDash(final String a, final String b, final Comparator<Object> c, int version) {
+        if (version < 7) return 0;
+        String s1 = withoutDash(a);
+        String s2 = withoutDash(b);
+        return c.compare(s1, s2);
+    }
+
+    public String normalize(String s) {
+        return normalizer == null ? s.toLowerCase() : normalizer.transform(s);
+    }
+
+    public int compareNormalized(final String s1, final String s2, final String n1, final String n2) {
+        int cn = compareWithoutDash(n1, n2, comparator, version);
+        if (cn != 0) {
+            return cn;
+        }
+        cn = comparator.compare(n1, n2);
+        if (cn != 0) {
+            return cn;
+        }
+        return comparator.compare(s1, s2);
+    }
+
+    @Override
+    public int compare(final String s1, final String s2) {
+        final String n1 = normalize(s1);
+        final String n2 = normalize(s2);
+        return compareNormalized(s1, s2, n1, n2);
     }
-    return comparator.compare(s1, s2);
-  }
 
 }