Skip to content

Commit c169bf6

Browse files
author
mgeipel
committed
fixed #129
1 parent b4df7cc commit c169bf6

File tree

2 files changed

+46
-19
lines changed

2 files changed

+46
-19
lines changed

src/main/java/org/culturegraph/mf/util/tries/SetReplacer.java

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,49 +15,75 @@
1515
*/
1616
package org.culturegraph.mf.util.tries;
1717

18+
import java.util.Collections;
19+
import java.util.Comparator;
1820
import java.util.List;
1921
import java.util.Map;
2022
import java.util.Map.Entry;
2123

24+
import org.culturegraph.mf.util.tries.SetMatcher.Match;
25+
2226
/**
2327
* @author Markus Michael Geipel
24-
*
28+
*
2529
*/
2630
public final class SetReplacer {
2731
private final SetMatcher<String> matcher = new SetMatcher<String>();
28-
29-
public void addReplacement(final String key, final String with){
32+
33+
public void addReplacement(final String key, final String with) {
3034
matcher.put(key, with);
3135
}
32-
33-
public void addReplacements(final Map<String, String> replacements){
36+
37+
public void addReplacements(final Map<String, String> replacements) {
3438
for (Entry<String, String> entry : replacements.entrySet()) {
3539
addReplacement(entry.getKey(), entry.getValue());
3640
}
3741
}
38-
39-
40-
public String replaceIn(final String text){
42+
43+
public String replaceIn(final String text) {
4144
final List<SetMatcher.Match<String>> matches = matcher.match(text);
4245
final StringBuilder builder = new StringBuilder();
43-
46+
4447
int lastCut = 0;
48+
49+
Collections.sort(matches, new Comparator<SetMatcher.Match<String>>() {
50+
@Override
51+
public int compare(final Match<String> o1, final Match<String> o2) {
52+
final int result;
53+
final int delta = o1.getStart() - o2.getStart();
54+
if (delta < 0) {
55+
result = -1;
56+
} else if (delta > 0) {
57+
result = 1;
58+
} else {
59+
if (o1.getLength() > o2.getLength()) {
60+
result = -1;
61+
} else {
62+
result = 1;
63+
}
64+
}
65+
return result;
66+
}
67+
68+
});
69+
4570
for (SetMatcher.Match<String> match : matches) {
46-
47-
if(match.getStart()<lastCut){
71+
72+
if (match.getStart() < lastCut) {
4873
continue;
4974
}
50-
51-
//System.out.println(match.getStart() + " "+ match.getValue() +" "+ match.getLength());
52-
75+
76+
// System.out.println(match.getStart() + " "+ match.getValue() +" "+
77+
// match.getLength());
78+
5379
builder.append(text.substring(lastCut, match.getStart()));
5480
builder.append(match.getValue());
55-
81+
5682
lastCut = match.getStart() + match.getLength();
5783
}
5884
builder.append(text.substring(lastCut, text.length()));
59-
85+
6086
return builder.toString();
6187
}
62-
88+
6389
}

src/test/java/org/culturegraph/mf/util/tries/SetReplaceTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void testReplace() {
3333

3434
final SetReplacer setReplace = new SetReplacer();
3535
final String text = "auf sylt mit super krabben entsafter und apfel";
36-
final String target = "auf hawaii mit super shirt entsafter und surfboard";
36+
final String target = "auf hawaii mit Mai Tai und surfboard";
3737

3838
setReplace.addReplacement("sylt", "hawaii");
3939
setReplace.addReplacement("apfel", "surfboard");
@@ -43,6 +43,7 @@ public void testReplace() {
4343
assertEquals(target, setReplace.replaceIn(text));
4444
}
4545

46+
@Test
4647
public void testReplaceWithInclusion() {
4748

4849
final SetReplacer setReplace = new SetReplacer();
@@ -52,7 +53,7 @@ public void testReplaceWithInclusion() {
5253
setReplace.addReplacement("fünfzig", "50");
5354

5455
assertEquals("50 äpfel", setReplace.replaceIn("fünfzig äpfel"));
55-
assertEquals("5 äpfel", setReplace.replaceIn("fünfz äpfel"));
56+
assertEquals("5 äpfel", setReplace.replaceIn("fünf äpfel"));
5657
}
5758

5859
}

0 commit comments

Comments
 (0)