📄 timeseries.java
字号:
/* ======================================
* JFreeChart : a free Java chart library
* ======================================
*
* Project Info: http://www.jfree.org/jfreechart/index.html
* Project Lead: David Gilbert (david.gilbert@object-refinery.com);
*
* (C) Copyright 2000-2003, by Object Refinery Limited and Contributors. All rights reserved.
*
* 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.
*
* ---------------
* TimeSeries.java
* ---------------
* (C) Copyright 2001-2003, by Object Refinery Limited.
*
* Original Author: David Gilbert (for Object Refinery Limited);
* Contributor(s): -;
*
* $Id: TimeSeries.java,v 1.12 2003/09/03 15:08:52 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.
*/
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).
*
* @author David Gilbert
*/
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 pairs 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.
* <P>
* By default, a daily time series is created. Use one of the other
* constructors if you require a different time period.
*
* @param name the name of the series.
*/
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.
* @param timePeriodClass the type of time period.
*/
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.
* @param domain the domain description.
* @param range the range description.
* @param timePeriodClass the type of time period.
*/
public TimeSeries(String name, String domain, String range, Class timePeriodClass) {
super(name);
this.domain = domain;
this.range = range;
this.timePeriodClass = timePeriodClass;
data = new java.util.ArrayList();
this.maximumItemCount = Integer.MAX_VALUE;
this.historyCount = 0;
}
/**
* Returns the domain description.
*
* @return the domain description.
*/
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 new description.
*/
public void setDomainDescription(String description) {
String old = this.domain;
this.domain = description;
firePropertyChange("Domain", old, description);
}
/**
* Returns the range description.
*
* @return the range description.
*/
public String getRangeDescription() {
return this.range;
}
/**
* Sets the range description.
* <P>
* Registered listeners are notified of the change.
*
* @param description the new description.
*/
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 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;
}
/**
* 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 Year for the time period, then all
* subsequent data items must also have a Year for the time period.
*
* @return the time period class for this series (null if the series is empty).
*/
public Class getTimePeriodClass() {
return this.timePeriodClass;
}
/**
* Returns one data pair for the series.
*
* @param index the item index (zero-based).
*
* @return one data pair for the series.
* @deprecated Use getDataItem(int).
*/
public TimeSeriesDataItem getDataPair(int index) {
return getDataItem(index);
}
/**
* Returns one data item for the series.
*
* @param index the item index (zero-based).
*
* @return One data item for the series.
*/
public TimeSeriesDataItem getDataItem(int index) {
return (TimeSeriesDataItem) data.get(index);
}
/**
* Returns the data pair for a specific period.
*
* @param period the period of interest.
*
* @return the data pair matching the specified period (or null if there is no match).
* @deprecated Use getDataItem(RegularTimePeriod).
*
*/
public TimeSeriesDataItem getDataPair(RegularTimePeriod period) {
return getDataItem(period);
}
/**
* 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(
"TimeSeries.getDataItem(...): null time period not allowed.");
}
// fetch the value...
TimeSeriesDataItem dummy = new TimeSeriesDataItem(period, new Integer(0));
int index = Collections.binarySearch(data, dummy);
if (index >= 0) {
return (TimeSeriesDataItem) data.get(index);
}
else {
return null;
}
}
/**
* Returns the time period at the specified index.
*
* @param index the index of the data pair.
*
* @return the time period at the specified index.
*/
public RegularTimePeriod getTimePeriod(int index) {
return getDataPair(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 series minus 'this'.
*/
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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -