/**** StringDelimiter.java ****/
/**********************************************************************
* Copyright (c) 1991 - 1998 Jerry Smith.
*
* This software is provided for demonstration purposes only. As
* freely-distributed, modifiable source code, this software carries
* absolutely no warranty. Jerry Smith disclaims all warranties for
* this software, including any implied warranties of merchantability
* and fitness, and shall not be liable for damages of any type
* resulting from its use.
* Permission to use, copy, modify, and distribute this source code
* for any purpose and without fee is hereby granted, provided that
* the above copyright and this permission notice appear in all
* copies and supporting documentation, and provided that Jerry Smith
* not be named in advertising or publicity pertaining to the
* redistribution of this software without specific, written prior
* permission.
**********************************************************************/
/**********************************************************************
StringDelimiter is an alternative to StringTokenizer that separates a
string into (string) tokens based on the presence of a multicharacter
delimiter.
**********************************************************************/
package flexlabel;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
public class StringDelimiter {
//
// Instance variables:
//
private String string;
private String delimiter;
private int cursor, delimiterLen;
//
// Constructors:
//
public StringDelimiter(String string, String delimiter) {
this.string = new String(string);
this.delimiter = new String(delimiter);
delimiterLen = delimiter.length();
initialize();
} // StringDelimiter //
//
// Public methods:
//
public int totalTokens() {
int oldCursor = cursor;
cursor = 0;
int total = countTokens();
cursor = oldCursor;
return total;
} // totalTokens //
public int countTokens() {
if (!stateOk())
return 0;
int count = 0, i = string.indexOf(delimiter, cursor), j = 0;
while (i != -1) {
j = i;
i = string.indexOf(delimiter, i + delimiterLen);
count++;
}
if (j < string.length() && !string.substring(j).equals(delimiter))
count++;
return count;
} // countTokens //
public boolean hasMoreTokens() {
if (!stateOk())
return false;
return string.indexOf(delimiter, cursor) != -1 ||
cursor < string.length();
} // hasMoreTokens //
public boolean hasMoreElements() {
return hasMoreTokens();
} // hasMoreElements //
public String nextToken() {
if (!stateOk())
throw new NoSuchElementException(
"StringDelimiter.nextToken(): null or empty string.");
int i = string.indexOf(delimiter, cursor);
if (i == -1) {
if (cursor < string.length()) {
String token = string.substring(cursor);
cursor = string.length();
return token;
}
else
throw new NoSuchElementException(
"StringDelimiter.nextToken(): no more tokens.");
}
else {
String token = string.substring(cursor, i);
cursor = i + delimiterLen;
return token;
}
} // nextToken //
public String nextToken(String delimiter) {
if (!stateOk())
throw new NoSuchElementException(
"StringDelimiter.nextToken(): null or empty string or delimiter.");
this.delimiter = delimiter;
delimiterLen = delimiter.length();
return nextToken();
} // nextToken //
public Object nextElement() {
return (Object) nextToken();
} // nextElement //
public void reset() {
initialize();
} // reset //
//
// Private methods:
//
private boolean stateOk() {
return !(string == null || delimiter == null ||
string.length() == 0 || delimiter.length() == 0 ||
string.equals(delimiter));
} // stateOk //
private void initialize() {
cursor = 0;
} // initialize //
/*****************************************************************************
public static void main(String[] args)
{
String testStr = "Java is a
great language.";
StringDelimiter sd = new StringDelimiter(testStr, "
");
// StringDelimiter sd = new StringDelimiter(testStr, "\n");
StringTokenizer st = new StringTokenizer(testStr, "\n");
System.out.println("The number of sd tokens is: " + sd.countTokens());
while (sd.hasMoreTokens())
System.out.println(sd.nextToken());
System.out.println("The number of st tokens is: " + st.countTokens());
while (st.hasMoreTokens())
System.out.println(st.nextToken());
System.out.println("THE END");
} // main //
*****************************************************************************/
} // StringDelimiter class //