///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002 Tom Morton
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//////////////////////////////////////////////////////////////////////////////
//package opennlp.tools.util;
/**
* Class for storing start and end integer offsets.
**/
public class Span implements Comparable {
private int start;
private int end;
/**
* Initializes a new Span Object.
*
* @param s start of span.
* @param e end of span.
*/
public Span(int s,int e) {
start=s;
end=e;
}
/**
* Return the start of a span.
*
* @return the start of a span.
**/
public int getStart() {
return start;
}
/**
* Return the end of a span.
*
* @return the end of a span.
**/
public int getEnd() {
return end;
}
/**
* Returns the length of this span.
*
* @return the length of the span.
*/
public int length() {
return end-start;
}
/**
* Returns true if the specified span is contained by this span.
* Identical spans are considered to contain each other.
*
* @param s The span to compare with this span.
*
* @return true is the specified span is contained by this span;
* false otherwise.
*/
public boolean contains(Span s) {
return start <= s.getStart() && s.getEnd() <= end;
}
public boolean contains(int index) {
return start <= index && index <= end;
}
/**
* Returns true if the specified span is the begin of this span and the
* specified span is contained in this span.
*
* @param s The span to compare with this span.
*
* @return true if the specified span starts with this span and is
* contained in this span; false otherwise
*/
public boolean startsWith(Span s) {
return getStart() == s.getStart() && contains(s);
}
/**
* Returns true if the specified span intersects with this span.
*
* @param s The span to compare with this span.
*
* @return true is the spans overlap; false otherwise.
*/
public boolean intersects(Span s) {
int sstart = s.getStart();
//either s's start is in this or this' start is in s
return this.contains(s) || s.contains(this) ||
getStart() <= sstart && sstart < getEnd() ||
sstart <= getStart() && getStart() < s.getEnd();
}
/**
* Returns true is the specified span crosses this span.
*
* @param s The span to compare with this span.
*
* @return true is the specified span overlaps this span and contains a
* non-overlapping section; false otherwise.
*/
public boolean crosses(Span s) {
int sstart = s.getStart();
//either s's start is in this or this' start is in s
return !this.contains(s) && !s.contains(this) &&
(getStart() <= sstart && sstart < getEnd() ||
sstart <= getStart() && getStart() < s.getEnd());
}
/**
* Retrieves the string covered by the current span of the specified text.
*
* @param text
*
* @return the substring covered by the current span
*/
public String getCoveredText(String text) {
if (getEnd() > text.length()) {
throw new IllegalArgumentException("The span " + toString() +
" is outside the given text!");
}
return text.substring(getStart(), getEnd());
}
/**
* Compares the specified span to the current span.
*/
public int compareTo(Object o) {
Span s = (Span) o;
if (getStart() < s.getStart()) {
return -1;
}
else if (getStart() == s.getStart()) {
if (getEnd() > s.getEnd()) {
return -1;
}
else if (getEnd() < s.getEnd()) {
return 1;
}
else {
return 0;
}
}
else {
return 1;
}
}
/**
* Generates a hash code of the current span.
*/
public int hashCode() {
return this.start << 16 | 0x0000FFFF | this.end;
}
/**
* Checks if the specified span is equal to the current span.
*/
public boolean equals(Object o) {
boolean result;
if (o == this) {
result = true;
}
else if (o instanceof Span) {
Span s = (Span) o;
result = getStart() == s.getStart() && getEnd() == s.getEnd();
}
else {
result = false;
}
return result;
}
/**
* Generates a human readable string.
*/
public String toString() {
StringBuffer toStringBuffer = new StringBuffer(15);
toStringBuffer.append(getStart());
toStringBuffer.append("..");
toStringBuffer.append(getEnd());
return toStringBuffer.toString();
}
/**
* Converts an array of {@link Span}s to an array of {@link String}s.
*
* @param spans
* @param s
* @return the strings
*/
public static String[] spansToStrings(Span[] spans, String s) {
String[] tokens = new String[spans.length];
for (int si = 0, sl = spans.length; si < sl; si++) {
tokens[si] = spans[si].getCoveredText(s);
}
return tokens;
}
public static String[] spansToStrings(Span[] spans, String[] tokens) {
String[] chunks = new String[spans.length];
StringBuffer cb = new StringBuffer();
for (int si = 0, sl = spans.length; si < sl; si++) {
cb.setLength(0);
for (int ti=spans[si].getStart();ti cb.append(tokens[ti]).append(" ");
}
chunks[si]=cb.substring(0, cb.length()-1);
}
return chunks;
}
}
///////////////////////////////////////////////////////////////////////////////
//Copyright (C) 2008 OpenNlp
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//////////////////////////////////////////////////////////////////////////////
package opennlp.tools.util;
import junit.framework.Assert;
import junit.framework.TestCase;
/**
* Tests for the {@link Span} class.
*/
public class SpanTest extends TestCase {
/**
* Test for {@link Span#getStart()}.
*/
public void testGetStart() {
Assert.assertEquals(5, new Span(5, 6).getStart());
}
/**
* Test for {@link Span#getEnd()}.
*/
public void testGetEnd() {
Assert.assertEquals(6, new Span(5, 6).getEnd());
}
/**
* Test for {@link Span#length()}.
*/
public void testLength() {
Assert.assertEquals(11, new Span(10, 21).length());
}
/**
* Test for {@link Span#contains(Span)}.
*/
public void testContains() {
Span a = new Span(500, 900);
Span b = new Span(520, 600);
Assert.assertEquals(true, a.contains(b));
}
/**
* Test for {@link Span#contains(Span)}.
*/
public void testContainsWithEqual() {
Span a = new Span(500, 900);
Assert.assertEquals(true, a.contains(a));
}
/**
* Test for {@link Span#contains(Span)}.
*/
public void testContainsWithLowerIntersect() {
Span a = new Span(500, 900);
Span b = new Span(450, 1000);
Assert.assertEquals(false, a.contains(b));
}
/**
* Test for {@link Span#contains(Span)}.
*/
public void testContainsWithHigherIntersect() {
Span a = new Span(500, 900);
Span b = new Span(500, 1000);
Assert.assertEquals(false, a.contains(b));
}
/**
* Test for {@link Span#contains(int)}.
*/
public void testContainsInt() {
Span a = new Span(10, 300);
Assert.assertFalse(a.contains(9));
Assert.assertTrue(a.contains(10));
Assert.assertTrue(a.contains(200));
Assert.assertTrue(a.contains(300));
Assert.assertFalse(a.contains(301));
}
/**
* Test for {@link Span#startsWith(Span)}.
*/
public void testStartsWith() {
Span a = new Span(10, 50);
Span b = new Span(10, 12);
Assert.assertTrue(a.startsWith(a));
Assert.assertTrue(a.startsWith(b));
Assert.assertFalse(b.startsWith(a));
}
/**
* Test for {@link Span#intersects(Span)}.
*/
public void testIntersects() {
Span a = new Span(10, 50);
Span b = new Span(40, 100);
Assert.assertTrue(a.intersects(b));
Assert.assertTrue(b.intersects(a));
Span c = new Span(10, 20);
Span d = new Span(40, 50);
Assert.assertFalse(c.intersects(d));
Assert.assertFalse(d.intersects(c));
Assert.assertTrue(b.intersects(d));
}
/**
* Test for {@link Span#crosses(Span)}.
*/
public void testCrosses() {
Span a = new Span(10, 50);
Span b = new Span(40, 100);
Assert.assertTrue(a.crosses(b));
Assert.assertTrue(b.crosses(a));
Span c = new Span(10, 20);
Span d = new Span(40, 50);
Assert.assertFalse(c.crosses(d));
Assert.assertFalse(d.crosses(c));
Assert.assertFalse(b.crosses(d));
}
/**
* Test for {@link Span#compareTo(Object)}.
*/
public void testCompareToLower() {
Span a = new Span(100, 1000);
Span b = new Span(10, 50);
Assert.assertEquals(true, a.compareTo(b) > 0);
}
/**
* Test for {@link Span#compareTo(Object)}.
*/
public void testCompareToHigher() {
Span a = new Span(100, 200);
Span b = new Span(300, 400);
Assert.assertEquals(true, a.compareTo(b) < 0);
}
/**
* Test for {@link Span#compareTo(Object)}.
*/
public void testCompareToEquals() {
Span a = new Span(30, 1000);
Span b = new Span(30, 1000);
Assert.assertEquals(true, a.compareTo(b) == 0);
}
/**
* Test for {@link Span#hashCode()}.
*/
public void testhHashCode() {
Assert.assertEquals(new Span(10, 11), new Span(10, 11));
}
/**
* Test for {@link Span#equals(Object)}.
*/
public void testEqualsWithNull() {
Span a = new Span(0, 0);
Assert.assertEquals(a.equals(null), false);
}
/**
* Test for {@link Span#equals(Object)}.
*/
public void testEquals() {
Span a = new Span(100, 1000);
Span b = new Span(100, 1000);
Assert.assertEquals(a.equals(b), true);
}
/**
* Test for {@link Span#toString()}.
*/
public void testToString() {
new Span(50, 100).toString();
}
}