Emit now also contains the start position of the found keyword

This commit is contained in:
robert-bor 2014-01-30 09:36:53 +01:00
parent b689165eb9
commit 922da26965
3 changed files with 26 additions and 19 deletions

View File

@ -1,16 +1,22 @@
package org.ahocorasick; package org.ahocorasick;
public class Emit { public class Emit {
private final int position; private final int start;
private final int end;
private final String keyword; private final String keyword;
public Emit(final int position, final String keyword) { public Emit(final int start, final int end, final String keyword) {
this.position = position; this.start = start;
this.end = end;
this.keyword = keyword; this.keyword = keyword;
} }
public int getPosition() { public int getStart() {
return this.position; return this.start;
}
public int getEnd() {
return this.end;
} }
public String getKeyword() { public String getKeyword() {

View File

@ -92,7 +92,7 @@ public class Trie {
Collection<String> emits = currentState.emit(); Collection<String> emits = currentState.emit();
if (emits != null && !emits.isEmpty()) { if (emits != null && !emits.isEmpty()) {
for (String emit : emits) { for (String emit : emits) {
collectedEmits.add(new Emit(position, emit)); collectedEmits.add(new Emit(position-emit.length()+1, position, emit));
} }
} }
} }

View File

@ -15,7 +15,7 @@ public class TrieTest {
trie.addKeyword("abc"); trie.addKeyword("abc");
Collection<Emit> emits = trie.parseText("abc"); Collection<Emit> emits = trie.parseText("abc");
Iterator<Emit> iterator = emits.iterator(); Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 2, "abc"); checkEmit(iterator.next(), 0, 2, "abc");
} }
@Test @Test
@ -24,7 +24,7 @@ public class TrieTest {
trie.addKeyword("abc"); trie.addKeyword("abc");
Collection<Emit> emits = trie.parseText(" abc"); Collection<Emit> emits = trie.parseText(" abc");
Iterator<Emit> iterator = emits.iterator(); Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 3, "abc"); checkEmit(iterator.next(), 1, 3, "abc");
} }
@Test @Test
@ -35,7 +35,7 @@ public class TrieTest {
trie.addKeyword("cde"); trie.addKeyword("cde");
Collection<Emit> emits = trie.parseText("bcd"); Collection<Emit> emits = trie.parseText("bcd");
Iterator<Emit> iterator = emits.iterator(); Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 2, "bcd"); checkEmit(iterator.next(), 0, 2, "bcd");
} }
@Test @Test
@ -48,9 +48,9 @@ public class TrieTest {
Collection<Emit> emits = trie.parseText("ushers"); Collection<Emit> emits = trie.parseText("ushers");
assertEquals(3, emits.size()); // she @ 3, he @ 3, hers @ 5 assertEquals(3, emits.size()); // she @ 3, he @ 3, hers @ 5
Iterator<Emit> iterator = emits.iterator(); Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 3, "she"); checkEmit(iterator.next(), 1, 3, "she");
checkEmit(iterator.next(), 3, "he"); checkEmit(iterator.next(), 2, 3, "he");
checkEmit(iterator.next(), 5, "hers"); checkEmit(iterator.next(), 2, 5, "hers");
} }
@Test @Test
@ -59,7 +59,7 @@ public class TrieTest {
trie.addKeyword("hers"); trie.addKeyword("hers");
Collection<Emit> emits = trie.parseText("h he her hers"); Collection<Emit> emits = trie.parseText("h he her hers");
Iterator<Emit> iterator = emits.iterator(); Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 12, "hers"); checkEmit(iterator.next(), 9, 12, "hers");
} }
@Test @Test
@ -71,14 +71,15 @@ public class TrieTest {
trie.addKeyword("tomatoes"); trie.addKeyword("tomatoes");
Collection<Emit> emits = trie.parseText("2 cauliflowers, 3 tomatoes, 4 slices of veal, 100g broccoli"); Collection<Emit> emits = trie.parseText("2 cauliflowers, 3 tomatoes, 4 slices of veal, 100g broccoli");
Iterator<Emit> iterator = emits.iterator(); Iterator<Emit> iterator = emits.iterator();
checkEmit(iterator.next(), 12, "cauliflower"); checkEmit(iterator.next(), 2, 12, "cauliflower");
checkEmit(iterator.next(), 25, "tomatoes"); checkEmit(iterator.next(), 18, 25, "tomatoes");
checkEmit(iterator.next(), 43, "veal"); checkEmit(iterator.next(), 40, 43, "veal");
checkEmit(iterator.next(), 58, "broccoli"); checkEmit(iterator.next(), 51, 58, "broccoli");
} }
private void checkEmit(Emit next, int expectedPosition, String expectedKeyword) { private void checkEmit(Emit next, int expectedStart, int expectedEnd, String expectedKeyword) {
assertEquals(expectedPosition, next.getPosition()); assertEquals(expectedStart, next.getStart());
assertEquals(expectedEnd, next.getEnd());
assertEquals(expectedKeyword, next.getKeyword()); assertEquals(expectedKeyword, next.getKeyword());
} }