📄 timeseries.java
字号:
/* =========================================================== * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * * (C) Copyright 2000-2004, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/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.] * * --------------- * TimeSeries.java * --------------- * (C) Copyright 2001-2003, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Bryan Scott; * * $Id: TimeSeries.java,v 1.25 2004/05/21 10:52:58 mungady Exp $ * * Changes * ------- * 11-Oct-2001 : Version 1 (DG); * 14-Nov-2001 : Added listener mechanism (DG); * 15-Nov-2001 : Updated argument checking and exceptions in add(...) method (DG); * 29-Nov-2001 : Added properties to describe the domain and range (DG); * 07-Dec-2001 : Renamed TimeSeries --> BasicTimeSeries (DG); * 01-Mar-2002 : Updated import statements (DG); * 28-Mar-2002 : Added a method add(TimePeriod, double) (DG); * 27-Aug-2002 : Changed return type of delete method to void (DG); * 04-Oct-2002 : Added itemCount and historyCount attributes, fixed errors reported by * Checkstyle (DG); * 29-Oct-2002 : Added series change notification to addOrUpdate(...) method (DG); * 28-Jan-2003 : Changed name back to TimeSeries (DG); * 13-Mar-2003 : Moved to com.jrefinery.data.time package and implemented Serializable (DG); * 01-May-2003 : Updated equals(...) method (see bug report 727575) (DG); * 14-Aug-2003 : Added ageHistoryCountItems method (copied existing code for contents) made * a method and added to addOrUpdate. Made a public method to enable ageing * against a specified time (eg now) as opposed to lastest time in series (BS); * 15-Oct-2003 : Added fix for setItemCount method - see bug report 804425. Modified exception * message in add(...) method to be more informative (DG); * 13-Apr-2004 : Added clear() method (DG); * 21-May-2004 : Added an extra addOrUpdate() method (DG); * */package org.jfree.data.time;import java.io.Serializable;import java.util.Collection;import java.util.Collections;import java.util.List;import org.jfree.data.Series;import org.jfree.data.SeriesException;/** * Represents a sequence of zero or more data items in the form (period, value). */public class TimeSeries extends Series implements Cloneable, Serializable { /** Default value for the domain description. */ protected static final String DEFAULT_DOMAIN_DESCRIPTION = "Time"; /** Default value for the range description. */ protected static final String DEFAULT_RANGE_DESCRIPTION = "Value"; /** A description of the domain. */ private String domain; /** A description of the range. */ private String range; /** The type of period for the data. */ protected Class timePeriodClass; /** The list of data items in the series. */ protected List data; /** The maximum number of items for the series. */ private int maximumItemCount; /** The history count. */ private int historyCount; /** * Creates a new (empty) time series. By default, a daily time series is created. * Use one of the other constructors if you require a different time period. * * @param name the series name (<code>null</code> not permitted). */ public TimeSeries(final String name) { this(name, DEFAULT_DOMAIN_DESCRIPTION, DEFAULT_RANGE_DESCRIPTION, Day.class); } /** * Creates a new (empty) time series. * * @param name the series name (<code>null</code> not permitted). * @param timePeriodClass the type of time period (<code>null</code> not permitted). */ public TimeSeries(final String name, final Class timePeriodClass) { this(name, DEFAULT_DOMAIN_DESCRIPTION, DEFAULT_RANGE_DESCRIPTION, timePeriodClass); } /** * Creates a new time series that contains no data. * <P> * Descriptions can be specified for the domain and range. One situation * where this is helpful is when generating a chart for the time series - * axis labels can be taken from the domain and range description. * * @param name the name of the series (<code>null</code> not permitted). * @param domain the domain description (<code>null</code> permitted). * @param range the range description (<code>null</code> permitted). * @param timePeriodClass the type of time period (<code>null</code> not permitted). */ public TimeSeries(final String name, final String domain, final String range, final Class timePeriodClass) { super(name); this.domain = domain; this.range = range; this.timePeriodClass = timePeriodClass; this.data = new java.util.ArrayList(); this.maximumItemCount = Integer.MAX_VALUE; this.historyCount = 0; } /** * Returns the domain description. * * @return The domain description (possibly <code>null</code>). */ public String getDomainDescription() { return this.domain; } /** * Sets the domain description. * <P> * A property change event is fired, and an undoable edit is posted. * * @param description the description (<code>null</code> permitted). */ public void setDomainDescription(final String description) { final String old = this.domain; this.domain = description; firePropertyChange("Domain", old, description); } /** * Returns the range description. * * @return The range description (possibly <code>null</code>). */ public String getRangeDescription() { return this.range; } /** * Sets the range description and fires a property change event for the 'Range' * property. * * @param description the description (<code>null</code> permitted). */ public void setRangeDescription(final String description) { final String old = this.range; this.range = description; firePropertyChange("Range", old, description); } /** * Returns the number of items in the series. * * @return The item count. */ public int getItemCount() { return this.data.size(); } /** * Returns the list of data items for the series (the list contains {@link TimeSeriesDataItem} * objects and is unmodifiable). * * @return The list of data items. */ public List getItems() { return Collections.unmodifiableList(this.data); } /** * Returns the maximum number of items that will be retained in the series. * <P> * The default value is <code>Integer.MAX_VALUE</code>). * * @return The maximum item count. */ public int getMaximumItemCount() { return this.maximumItemCount; } /** * Sets the maximum number of items that will be retained in the series. * <P> * If you add a new item to the series such that the number of items will exceed the * maximum item count, then the FIRST element in the series is automatically removed, * ensuring that the maximum item count is not exceeded. * * @param maximum the maximum. */ public void setMaximumItemCount(final int maximum) { this.maximumItemCount = maximum; while (this.data.size() > this.maximumItemCount) { this.data.remove(0); } } /** * Returns the history count for the series. * * @return The history count. */ public int getHistoryCount() { return this.historyCount; } /** * Sets the number of time units in the 'history' for the series. * <P> * This provides one mechanism for automatically dropping old data from the time series. * For example, if a series contains daily data, you might set the history count to 30. * Then, when you add a new data item, all data items more than 30 days older than the latest * value are automatically dropped from the series. * * @param periods the number of time periods. */ public void setHistoryCount(final int periods) { this.historyCount = periods; } /** * Returns the time period class for this series. * <p> * Only one time period class can be used within a single series (enforced). * If you add a data item with a {@link Year} for the time period, then all * subsequent data items must also have a {@link Year} for the time period. * * @return The time period class (never <code>null</code>). */ public Class getTimePeriodClass() { return this.timePeriodClass; } /** * Returns a data item for the series. * * @param index the item index (zero-based). * * @return The data item. */ public TimeSeriesDataItem getDataItem(final int index) { return (TimeSeriesDataItem) this.data.get(index); } /** * Returns the data item for a specific period. * * @param period the period of interest (<code>null</code> not allowed). * * @return The data item matching the specified period (or <code>null</code> if there is * no match). * */ public TimeSeriesDataItem getDataItem(final RegularTimePeriod period) { // check arguments... if (period == null) { throw new IllegalArgumentException("Null 'period' argument"); } // fetch the value... final TimeSeriesDataItem dummy = new TimeSeriesDataItem(period, new Integer(0)); final int index = Collections.binarySearch(this.data, dummy); if (index >= 0) { return (TimeSeriesDataItem) this.data.get(index); } else { return null; } } /** * Returns the time period at the specified index. * * @param index the index of the data item. * * @return The time period. */ public RegularTimePeriod getTimePeriod(final int index) { return getDataItem(index).getPeriod(); } /** * Returns a time period that would be the next in sequence on the end of * the time series. * * @return The next time period. */ public RegularTimePeriod getNextTimePeriod() { final RegularTimePeriod last = getTimePeriod(getItemCount() - 1); return last.next(); } /** * Returns a collection of all the time periods in the time series. * * @return A collection of all the time periods. */ public Collection getTimePeriods() { final Collection result = new java.util.ArrayList(); for (int i = 0; i < getItemCount(); i++) { result.add(getTimePeriod(i)); } return result; } /** * Returns a collection of time periods in the specified series, but not in * this series, and therefore unique to the specified series. * * @param series the series to check against this one. * * @return The unique time periods. */ public Collection getTimePeriodsUniqueToOtherSeries(final TimeSeries series) { final Collection result = new java.util.ArrayList(); for (int i = 0; i < series.getItemCount(); i++) { final RegularTimePeriod period = series.getTimePeriod(i); final int index = getIndex(period); if (index < 0) { result.add(period); } } return result; } /** * Returns the index for the item (if any) that corresponds to a time period. * * @param period the time period (<code>null</code> not permitted). * * @return The index. */ public int getIndex(final RegularTimePeriod period) { // check argument... if (period == null) { throw new IllegalArgumentException("Null 'period' argument."); } // fetch the value... final TimeSeriesDataItem dummy = new TimeSeriesDataItem(period, new Integer(0)); final int index = Collections.binarySearch(this.data, dummy); return index; } /** * Returns the value at the specified index. * * @param index index of a value. * * @return The value (possibly <code>null</code>). */ public Number getValue(final int index) { return getDataItem(index).getValue(); } /** * Returns the value for a time period. If there is no data item with the specified period, * this method will return <code>null</code>. * * @param period time period (<code>null</code> not permitted). * * @return The value (possibly <code>null</code>). */ public Number getValue(final RegularTimePeriod period) { final int index = getIndex(period); if (index >= 0) { return getValue(index); } else { return null; } } /** * Adds a data item to the series and sends a {@link org.jfree.data.SeriesChangeEvent}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -