linebreakiterator.java

来自「JfreeChart 常用图表例子」· Java 代码 · 共 253 行

JAVA
253
字号
/* ======================================================================== * JCommon : a free general purpose class library for the Java(tm) platform * ======================================================================== * * (C) Copyright 2000-2004, by Object Refinery Limited and Contributors. * * Project Info:  http://www.jfree.org/jcommon/index.html * * 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 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ---------------------- * LineBreakIterator.java * ---------------------- * (C)opyright 2003, by Thomas Morgner and Contributors. * * Original Author:  Thomas Morgner; * Contributor(s):   David Gilbert (for Object Refinery Limited); * * $Id: LineBreakIterator.java,v 1.2 2004/11/27 16:54:29 mungady Exp $ * * Changes * ------- * 13-03-2003 : Initial version */package org.jfree.util;import java.util.Iterator;/** * An iterator that breaks text into lines. * The result is equal to BufferedReader.readLine(). * * @author Thomas Morgner */public class LineBreakIterator implements Iterator{  /** A useful constant. */  public static final int DONE = -1;  /** Storage for the text. */  private char[] text;  /** The current position. */  private int position;  /**   * Default constructor.   */  public LineBreakIterator()  {    setText("");  }  /**   * Creates a new line break iterator.   *   * @param text the text to be broken up.   */  public LineBreakIterator(final String text)  {    setText(text);  }  /**   * Returns the position of the next break.   *   * @return A position.   */  public synchronized int nextPosition()  {    if (this.text == null)    {      return DONE;    }    if (this.position == DONE)    {      return DONE;    }    // recognize \n, \r, \r\n    final int nChars = this.text.length;    int nextChar = this.position;    for (; ;)    {      if (nextChar >= nChars)      {        /* End of text reached */        this.position = DONE;        return DONE;      }      boolean eol = false;      char c = 0;      int i;      // search the next line break, either \n or \r      for (i = nextChar; i < nChars; i++)      {        c = this.text[i];        if ((c == '\n') || (c == '\r'))        {          eol = true;          break;        }      }      nextChar = i;      if (eol)      {        nextChar++;        if (c == '\r')        {          if ((nextChar < nChars) && (this.text[nextChar] == '\n'))          {            nextChar++;          }        }        this.position = nextChar;        return (this.position);      }    }  }  /**   * Same like next(), but returns the End-Of-Text as   * if there was a linebreak added (Reader.readLine() compatible)   *   * @return The next position.   */  public int nextWithEnd()  {    final int pos = this.position;    if (pos == DONE)    {      return DONE;    }    if (pos == this.text.length)    {      this.position = DONE;      return DONE;    }    final int retval = nextPosition();    if (retval == DONE)    {      return this.text.length;    }    return retval;  }  /**   * Returns the text to be broken up.   *   * @return The text.   */  public String getText()  {    return new String(this.text);  }  /**   * Sets the text to be broken up.   *   * @param text  the text.   */  public void setText(final String text)  {    this.position = 0;    this.text = text.toCharArray();  }  /**   * Returns <tt>true</tt> if the iteration has more elements. (In other   * words, returns <tt>true</tt> if <tt>next</tt> would return an element   * rather than throwing an exception.)   *   * @return <tt>true</tt> if the iterator has more elements.   */  public boolean hasNext()  {    return (this.position != DONE);  }  /**   * Returns the next element in the iteration.   *   * @return the next element in the iteration.   */  public Object next()  {    if (this.position == DONE)    {      // allready at the end ...      return null;    }    final int lastFound = this.position;    int pos = nextWithEnd();    if (pos == DONE)    {      // the end of the text has been reached ...      return new String(this.text, lastFound, this.text.length - lastFound);    }    // step one char back    if (pos > 0)    {      final int end = lastFound;      for (; ((pos) > end) && ((this.text[pos - 1] == '\n') || this.text[pos - 1] == '\r'); pos--)      {        // search the end of the current linebreak sequence ..      }    }    //System.out.println ("text: " + new String (text));    //System.out.println ("pos: " + pos + " lastFound: " + lastFound);    return new String(this.text, lastFound, pos - lastFound);  }  /**   *   * Removes from the underlying collection the last element returned by the   * iterator (optional operation).  This method can be called only once per   * call to <tt>next</tt>.  The behavior of an iterator is unspecified if   * the underlying collection is modified while the iteration is in   * progress in any way other than by calling this method.   *   * @exception UnsupportedOperationException if the <tt>remove</tt>   *    operation is not supported by this Iterator.   * @exception IllegalStateException if the <tt>next</tt> method has not   *    yet been called, or the <tt>remove</tt> method has already   *    been called after the last call to the <tt>next</tt>   *    method.   */  public void remove()  {      throw new UnsupportedOperationException("This iterator is read-only.");  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?