Skip to content

Commit eafc2b9

Browse files
committed
[CODEC-125] Implement a Beider-Morse phonetic matching codec. Applied patch https://issues.apache.org/jira/secure/attachment/12489767/comparator.patch
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/codec/trunk@1155182 13f79535-47bb-0310-9956-ffa450edef68
1 parent 29524ee commit eafc2b9

File tree

3 files changed

+25
-22
lines changed

3 files changed

+25
-22
lines changed

src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ private PhonemeBuilder applyFinalRules(PhonemeBuilder phonemeBuilder, List<Rule>
251251
return phonemeBuilder;
252252
}
253253

254-
Set<Rule.Phoneme> phonemes = new TreeSet<Rule.Phoneme>();
254+
Set<Rule.Phoneme> phonemes = new TreeSet<Rule.Phoneme>(Rule.Phoneme.COMPARATOR);
255255

256256
for (Rule.Phoneme phoneme : phonemeBuilder.getPhonemes()) {
257257
PhonemeBuilder subBuilder = PhonemeBuilder.empty(phoneme.getLanguages());

src/java/org/apache/commons/codec/language/bm/Rule.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.ArrayList;
2222
import java.util.Arrays;
2323
import java.util.Collections;
24+
import java.util.Comparator;
2425
import java.util.EnumMap;
2526
import java.util.HashMap;
2627
import java.util.HashSet;
@@ -80,7 +81,26 @@
8081
*/
8182
public class Rule {
8283

83-
public static final class Phoneme implements PhonemeExpr, Comparable<Phoneme> {
84+
public static final class Phoneme implements PhonemeExpr {
85+
public static final Comparator<Phoneme> COMPARATOR = new Comparator<Phoneme>() {
86+
public int compare(Phoneme o1, Phoneme o2) {
87+
for (int i = 0; i < o1.phonemeText.length(); i++) {
88+
if (i >= o2.phonemeText.length()) {
89+
return +1;
90+
}
91+
int c = o1.phonemeText.charAt(i) - o2.phonemeText.charAt(i);
92+
if (c != 0) {
93+
return c;
94+
}
95+
}
96+
97+
if (o1.phonemeText.length() < o2.phonemeText.length()) {
98+
return -1;
99+
}
100+
101+
return 0;
102+
}
103+
};
84104

85105
private final CharSequence phonemeText;
86106
private final Languages.LanguageSet languages;
@@ -94,24 +114,6 @@ public Phoneme append(CharSequence str) {
94114
return new Phoneme(this.phonemeText.toString() + str.toString(), this.languages);
95115
}
96116

97-
public int compareTo(Phoneme o) {
98-
for (int i = 0; i < phonemeText.length(); i++) {
99-
if (i >= o.phonemeText.length()) {
100-
return +1;
101-
}
102-
int c = phonemeText.charAt(i) - o.phonemeText.charAt(i);
103-
if (c != 0) {
104-
return c;
105-
}
106-
}
107-
108-
if (phonemeText.length() < o.phonemeText.length()) {
109-
return -1;
110-
}
111-
112-
return 0;
113-
}
114-
115117
public Languages.LanguageSet getLanguages() {
116118
return this.languages;
117119
}

src/test/org/apache/commons/codec/language/bm/RuleTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public void phonemeComparedToLaterIsNegative() {
6363
for (Rule.Phoneme[] phs : makePhonemes()) {
6464
for (int i = 0; i < phs.length; i++) {
6565
for (int j = i + 1; j < phs.length; j++) {
66-
int c = phs[i].compareTo(phs[j]);
66+
int c = Rule.Phoneme.COMPARATOR.compare(phs[i], phs[j]);
6767

6868
assertThat("Comparing " + phs[i].getPhonemeText() + " to " + phs[j].getPhonemeText() + " should be negative", c,
6969
new NegativeIntegerBaseMatcher());
@@ -76,7 +76,8 @@ public void phonemeComparedToLaterIsNegative() {
7676
public void phonemeComparedToSelfIsZero() {
7777
for (Rule.Phoneme[] phs : makePhonemes()) {
7878
for (Rule.Phoneme ph : phs) {
79-
assertEquals("Phoneme compared to itself should be zero: " + ph.getPhonemeText(), 0, ph.compareTo(ph));
79+
assertEquals("Phoneme compared to itself should be zero: " + ph.getPhonemeText(), 0,
80+
Rule.Phoneme.COMPARATOR.compare(ph, ph));
8081
}
8182
}
8283
}

0 commit comments

Comments
 (0)