📄 timeseries.java
字号:
/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2007, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ---------------
* TimeSeries.java
* ---------------
* (C) Copyright 2001-2007, by Object Refinery Limited.
*
* Original Author: David Gilbert (for Object Refinery Limited);
* Contributor(s): Bryan Scott;
* Nick Guenther;
*
* 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);
* 15-Jun-2004 : Fixed NullPointerException in equals() method (DG);
* 29-Nov-2004 : Fixed bug 1075255 (DG);
* 17-Nov-2005 : Renamed historyCount --> maximumItemAge (DG);
* 28-Nov-2005 : Changed maximumItemAge from int to long (DG);
* 01-Dec-2005 : New add methods accept notify flag (DG);
* ------------- JFREECHART 1.0.x ---------------------------------------------
* 24-May-2006 : Improved error handling in createCopy() methods (DG);
* 01-Sep-2006 : Fixed bugs in removeAgedItems() methods - see bug report
* 1550045 (DG);
* 22-Mar-2007 : Simplified getDataItem(RegularTimePeriod) - see patch 1685500
* by Nick Guenther (DG);
* 31-Oct-2007 : Implemented faster hashCode() (DG);
*
*/
package org.jfree.data.time;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import org.jfree.data.general.Series;
import org.jfree.data.general.SeriesChangeEvent;
import org.jfree.data.general.SeriesException;
import org.jfree.util.ObjectUtilities;
/**
* Represents a sequence of zero or more data items in the form (period, value).
*/
public class TimeSeries extends Series implements Cloneable, Serializable {
/** For serialization. */
private static final long serialVersionUID = -5032960206869675528L;
/** 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 maximum age of items for the series, specified as a number of
* time periods.
*/
private long maximumItemAge;
/**
* 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(Comparable name) {
this(name, DEFAULT_DOMAIN_DESCRIPTION, DEFAULT_RANGE_DESCRIPTION,
Day.class);
}
/**
* Creates a new (empty) time series with the specified name and class
* of {@link RegularTimePeriod}.
*
* @param name the series name (<code>null</code> not permitted).
* @param timePeriodClass the type of time period (<code>null</code> not
* permitted).
*/
public TimeSeries(Comparable name, 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(Comparable name, String domain, String range,
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.maximumItemAge = Long.MAX_VALUE;
}
/**
* Returns the domain description.
*
* @return The domain description (possibly <code>null</code>).
*
* @see #setDomainDescription(String)
*/
public String getDomainDescription() {
return this.domain;
}
/**
* Sets the domain description and sends a <code>PropertyChangeEvent</code>
* (with the property name <code>Domain</code>) to all registered
* property change listeners.
*
* @param description the description (<code>null</code> permitted).
*
* @see #getDomainDescription()
*/
public void setDomainDescription(String description) {
String old = this.domain;
this.domain = description;
firePropertyChange("Domain", old, description);
}
/**
* Returns the range description.
*
* @return The range description (possibly <code>null</code>).
*
* @see #setRangeDescription(String)
*/
public String getRangeDescription() {
return this.range;
}
/**
* Sets the range description and sends a <code>PropertyChangeEvent</code>
* (with the property name <code>Range</code>) to all registered listeners.
*
* @param description the description (<code>null</code> permitted).
*
* @see #getRangeDescription()
*/
public void setRangeDescription(String description) {
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.
* The default value is <code>Integer.MAX_VALUE</code>.
*
* @return The maximum item count.
*
* @see #setMaximumItemCount(int)
*/
public int getMaximumItemCount() {
return this.maximumItemCount;
}
/**
* Sets the maximum number of items that will be retained in the series.
* 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 (requires >= 0).
*
* @see #getMaximumItemCount()
*/
public void setMaximumItemCount(int maximum) {
if (maximum < 0) {
throw new IllegalArgumentException("Negative 'maximum' argument.");
}
this.maximumItemCount = maximum;
int count = this.data.size();
if (count > maximum) {
delete(0, count - maximum - 1);
}
}
/**
* Returns the maximum item age (in time periods) for the series.
*
* @return The maximum item age.
*
* @see #setMaximumItemAge(long)
*/
public long getMaximumItemAge() {
return this.maximumItemAge;
}
/**
* Sets the number of time units in the 'history' for the series. 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.
*
* @see #getMaximumItemAge()
*/
public void setMaximumItemAge(long periods) {
if (periods < 0) {
throw new IllegalArgumentException("Negative 'periods' argument.");
}
this.maximumItemAge = periods;
removeAgedItems(true); // remove old items and notify if necessary
}
/**
* 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.
*
* @see #getDataItem(RegularTimePeriod)
*/
public TimeSeriesDataItem getDataItem(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).
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -