]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/engine/NormalizeComparator.java
Allow caching normalization step of comparator.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / NormalizeComparator.java
1 // Copyright 2011 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package com.hughes.android.dictionary.engine;
16
17 import java.util.Comparator;
18
19 import com.ibm.icu.text.Transliterator;
20
21 public class NormalizeComparator implements Comparator<String> {
22
23     private final Transliterator normalizer;
24     private final Comparator<Object> comparator;
25     private final int version;
26
27     public NormalizeComparator(final Transliterator normalizer,
28                                final Comparator<Object> comparator, int version) {
29         this.normalizer = normalizer;
30         this.comparator = comparator;
31         this.version = version;
32     }
33
34     public static String withoutDash(final String a) {
35         return a.replace("-", "").replace("þ", "th").replace("Þ", "Th");
36     }
37
38     // Handles comparison between items containing "-".
39     // Also replaces other problematic cases like "thorn".
40     public static int compareWithoutDash(final String a, final String b, final Comparator<Object> c, int version) {
41         if (version < 7) return 0;
42         String s1 = withoutDash(a);
43         String s2 = withoutDash(b);
44         return c.compare(s1, s2);
45     }
46
47     public String normalize(String s) {
48         return normalizer == null ? s.toLowerCase() : normalizer.transform(s);
49     }
50
51     public int compareNormalized(final String s1, final String s2, final String n1, final String n2) {
52         int cn = compareWithoutDash(n1, n2, comparator, version);
53         if (cn != 0) {
54             return cn;
55         }
56         cn = comparator.compare(n1, n2);
57         if (cn != 0) {
58             return cn;
59         }
60         return comparator.compare(s1, s2);
61     }
62
63     @Override
64     public int compare(final String s1, final String s2) {
65         final String n1 = normalize(s1);
66         final String n2 = normalize(s2);
67         return compareNormalized(s1, s2, n1, n2);
68     }
69
70 }