/**** 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 //