📄 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.1 2004/08/31 15:34:18 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);
* 15-Jun-2004 : Fixed NullPointerException in equals() 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.general.Series;
import org.jfree.data.general.SeriesException;
import org.jfree.util.ObjectUtils;
/**
* 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(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(String 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(String 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.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(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>).
*/
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(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.
* <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(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(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(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(RegularTimePeriod period) {
// check arguments...
if (period == null) {
throw new IllegalArgumentException("Null 'period' argument");
}
// fetch the value...
TimeSeriesDataItem dummy = new TimeSeriesDataItem(period, new Integer(0));
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(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() {
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() {
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(TimeSeries series) {
Collection result = new java.util.ArrayList();
for (int i = 0; i < series.getItemCount(); i++) {
RegularTimePeriod period = series.getTimePeriod(i);
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(RegularTimePeriod period) {
// check argument...
if (period == null) {
throw new IllegalArgumentException("Null 'period' argument.");
}
// fetch the value...
TimeSeriesDataItem dummy = new TimeSeriesDataItem(period, new Integer(0));
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(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(RegularTimePeriod period) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -