From: <mu...@us...> - 2007-10-02 10:02:54
|
Revision: 217 http://jfreechart.svn.sourceforge.net/jfreechart/?rev=217&view=rev Author: mungady Date: 2007-10-02 03:02:52 -0700 (Tue, 02 Oct 2007) Log Message: ----------- 2007-10-02 David Gilbert <dav...@ob...> * source/org/jfree/data/statistics/BoxAndWhiskerItem.java (BoxAndWhiskerItem(double, double, double, double, double, double, double, double, List)): New constructor, * source/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java (minimumRangeValue): Changed from Number to double, (minimumRangeValueRow): New field, (minimumRangeValueColumn): Likewise, (maximumRangeValue): Changed from Number to double, (maximumRangeValueRow): New field, (maximumRangeValueColumn): Likewise, (DefaultBoxAndWhiskerCategoryDataset): Updated for changed field types, (add): Fix updating of cached range values, (getRangeLowerBound): Update for changed field type, (getRangeUpperBound): Likewise, * tests/org/jfree/data/statistics/junit/DefaultBoxAndWhiskerCategoryDataset.java (testAdd): New test method, (testAddUpdatesCachedRange): Likewise, (testConstructor): Likewise. Modified Paths: -------------- trunk/ChangeLog trunk/source/org/jfree/data/statistics/BoxAndWhiskerItem.java trunk/source/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java trunk/tests/org/jfree/data/statistics/junit/DefaultBoxAndWhiskerCategoryDatasetTests.java Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2007-10-02 09:52:32 UTC (rev 216) +++ trunk/ChangeLog 2007-10-02 10:02:52 UTC (rev 217) @@ -1,3 +1,24 @@ +2007-10-02 David Gilbert <dav...@ob...> + + * source/org/jfree/data/statistics/BoxAndWhiskerItem.java + (BoxAndWhiskerItem(double, double, double, double, double, double, + double, double, List)): New constructor, + * source/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java + (minimumRangeValue): Changed from Number to double, + (minimumRangeValueRow): New field, + (minimumRangeValueColumn): Likewise, + (maximumRangeValue): Changed from Number to double, + (maximumRangeValueRow): New field, + (maximumRangeValueColumn): Likewise, + (DefaultBoxAndWhiskerCategoryDataset): Updated for changed field types, + (add): Fix updating of cached range values, + (getRangeLowerBound): Update for changed field type, + (getRangeUpperBound): Likewise, + * tests/org/jfree/data/statistics/junit/DefaultBoxAndWhiskerCategoryDataset.java + (testAdd): New test method, + (testAddUpdatesCachedRange): Likewise, + (testConstructor): Likewise. + 2007-09-28 David Gilbert <dav...@ob...> * source/org/jfree/data/KeyedObjects.java Modified: trunk/source/org/jfree/data/statistics/BoxAndWhiskerItem.java =================================================================== --- trunk/source/org/jfree/data/statistics/BoxAndWhiskerItem.java 2007-10-02 09:52:32 UTC (rev 216) +++ trunk/source/org/jfree/data/statistics/BoxAndWhiskerItem.java 2007-10-02 10:02:52 UTC (rev 217) @@ -32,8 +32,6 @@ * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * $Id: BoxAndWhiskerItem.java,v 1.5.2.4 2007/01/17 15:35:00 mungady Exp $ - * * Changes * ------- * 27-Aug-2003 : Version 1 (DG); @@ -41,6 +39,7 @@ * ------------- JFREECHART 1.0.x --------------------------------------------- * 15-Nov-2006 : Added toString() method override (DG); * 21-Jun-2007 : Removed JCommon dependencies (DG); + * 02-Oct-2007 : Added new constructor (for convenience) (DG); * */ @@ -126,6 +125,33 @@ } /** + * Creates a new box-and-whisker item. + * + * @param mean the mean. + * @param median the median + * @param q1 the first quartile. + * @param q3 the third quartile. + * @param minRegularValue the minimum regular value. + * @param maxRegularValue the maximum regular value. + * @param minOutlier the minimum outlier value. + * @param maxOutlier the maximum outlier value. + * @param outliers a list of the outliers. + * + * @since 1.0.7 + */ + public BoxAndWhiskerItem(double mean, double median, double q1, double q3, + double minRegularValue, double maxRegularValue, double minOutlier, + double maxOutlier, List outliers) { + + // pass values to other constructor + this(new Double(mean), new Double(median), new Double(q1), + new Double(q3), new Double(minRegularValue), + new Double(maxRegularValue), new Double(minOutlier), + new Double(maxOutlier), outliers); + + } + + /** * Returns the mean. * * @return The mean (possibly <code>null</code>). Modified: trunk/source/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java =================================================================== --- trunk/source/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java 2007-10-02 09:52:32 UTC (rev 216) +++ trunk/source/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java 2007-10-02 10:02:52 UTC (rev 217) @@ -49,6 +49,7 @@ * 13-Jun-2007 : Fixed error in previous patch (DG); * 21-Jun-2007 : Removed JCommon dependencies (DG); * 28-Sep-2007 : Fixed cloning bug (DG); + * 02-Oct-2007 : Fixed bug in updating cached bounds (DG); * */ @@ -74,11 +75,27 @@ protected KeyedObjects2D data; /** The minimum range value. */ - private Number minimumRangeValue; + private double minimumRangeValue; + + /** The row index for the cell that the minimum range value comes from. */ + private int minimumRangeValueRow; + + /** + * The column index for the cell that the minimum range value comes from. + */ + private int minimumRangeValueColumn; /** The maximum range value. */ - private Number maximumRangeValue; + private double maximumRangeValue; + /** The row index for the cell that the maximum range value comes from. */ + private int maximumRangeValueRow; + + /** + * The column index for the cell that the maximum range value comes from. + */ + private int maximumRangeValueColumn; + /** The range of values. */ private Range rangeBounds; @@ -87,8 +104,12 @@ */ public DefaultBoxAndWhiskerCategoryDataset() { this.data = new KeyedObjects2D(); - this.minimumRangeValue = null; - this.maximumRangeValue = null; + this.minimumRangeValue = Double.NaN; + this.minimumRangeValueRow = -1; + this.minimumRangeValueColumn = -1; + this.maximumRangeValue = Double.NaN; + this.maximumRangeValueRow = -1; + this.maximumRangeValueColumn = -1; this.rangeBounds = new Range(0.0, 0.0); } @@ -120,6 +141,20 @@ Comparable columnKey) { this.data.addObject(item, rowKey, columnKey); + + // update cached min and max values + int r = this.data.getRowIndex(rowKey); + int c = this.data.getColumnIndex(columnKey); + if (this.maximumRangeValueRow == r + && this.maximumRangeValueColumn == c) { + this.maximumRangeValue = Double.NaN; + } + if (this.minimumRangeValueRow == r + && this.minimumRangeValueColumn == c) { + this.minimumRangeValue = Double.NaN; + } + + double minval = Double.NaN; if (item.getMinOutlier() != null) { minval = item.getMinOutlier().doubleValue(); @@ -129,22 +164,30 @@ maxval = item.getMaxOutlier().doubleValue(); } - if (this.maximumRangeValue == null) { - this.maximumRangeValue = new Double(maxval); + if (Double.isNaN(this.maximumRangeValue)) { + this.maximumRangeValue = maxval; + this.maximumRangeValueRow = r; + this.maximumRangeValueColumn = c; } - else if (maxval > this.maximumRangeValue.doubleValue()) { - this.maximumRangeValue = new Double(maxval); + else if (maxval > this.maximumRangeValue) { + this.maximumRangeValue = maxval; + this.maximumRangeValueRow = r; + this.maximumRangeValueColumn = c; } - if (this.minimumRangeValue == null) { - this.minimumRangeValue = new Double(minval); + if (Double.isNaN(this.minimumRangeValue)) { + this.minimumRangeValue = minval; + this.minimumRangeValueRow = r; + this.minimumRangeValueColumn = c; } - else if (minval < this.minimumRangeValue.doubleValue()) { - this.minimumRangeValue = new Double(minval); + else if (minval < this.minimumRangeValue) { + this.minimumRangeValue = minval; + this.minimumRangeValueRow = r; + this.minimumRangeValueColumn = c; } - this.rangeBounds = new Range(this.minimumRangeValue.doubleValue(), - this.maximumRangeValue.doubleValue()); + this.rangeBounds = new Range(this.minimumRangeValue, + this.maximumRangeValue); fireDatasetChanged(); @@ -169,6 +212,9 @@ * @param column the column index. * * @return The value. + * + * @see #getMedianValue(int, int) + * @see #getValue(Comparable, Comparable) */ public Number getValue(int row, int column) { return getMedianValue(row, column); @@ -181,6 +227,9 @@ * @param columnKey the columnKey. * * @return The value. + * + * @see #getMedianValue(Comparable, Comparable) + * @see #getValue(int, int) */ public Number getValue(Comparable rowKey, Comparable columnKey) { return getMedianValue(rowKey, columnKey); @@ -421,11 +470,7 @@ * @return The minimum value. */ public double getRangeLowerBound(boolean includeInterval) { - double result = Double.NaN; - if (this.minimumRangeValue != null) { - result = this.minimumRangeValue.doubleValue(); - } - return result; + return this.minimumRangeValue; } /** @@ -437,11 +482,7 @@ * @return The maximum value. */ public double getRangeUpperBound(boolean includeInterval) { - double result = Double.NaN; - if (this.maximumRangeValue != null) { - result = this.maximumRangeValue.doubleValue(); - } - return result; + return this.maximumRangeValue; } /** Modified: trunk/tests/org/jfree/data/statistics/junit/DefaultBoxAndWhiskerCategoryDatasetTests.java =================================================================== --- trunk/tests/org/jfree/data/statistics/junit/DefaultBoxAndWhiskerCategoryDatasetTests.java 2007-10-02 09:52:32 UTC (rev 216) +++ trunk/tests/org/jfree/data/statistics/junit/DefaultBoxAndWhiskerCategoryDatasetTests.java 2007-10-02 10:02:52 UTC (rev 217) @@ -37,6 +37,7 @@ * 01-Mar-2004 : Version 1 (DG); * 17-Apr-2007 : Added a test for bug 1701822 (DG); * 28-Sep-2007 : Enhanced testClone() (DG); + * 02-Oct-2007 : Added new tests (DG); * */ @@ -54,6 +55,7 @@ import junit.framework.TestCase; import junit.framework.TestSuite; +import org.jfree.data.Range; import org.jfree.data.statistics.BoxAndWhiskerItem; import org.jfree.data.statistics.DefaultBoxAndWhiskerCategoryDataset; @@ -181,4 +183,84 @@ } } + + private static final double EPSILON = 0.0000000001; + + /** + * Some checks for the add() method. + */ + public void testAdd() { + DefaultBoxAndWhiskerCategoryDataset dataset + = new DefaultBoxAndWhiskerCategoryDataset(); + BoxAndWhiskerItem item1 = new BoxAndWhiskerItem(1.0, 2.0, 3.0, 4.0, + 5.0, 6.0, 7.0, 8.0, new ArrayList()); + dataset.add(item1, "R1", "C1"); + + assertEquals(2.0, dataset.getValue("R1", "C1").doubleValue(), EPSILON); + assertEquals(1.0, dataset.getMeanValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(2.0, dataset.getMedianValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(3.0, dataset.getQ1Value("R1", "C1").doubleValue(), + EPSILON); + assertEquals(4.0, dataset.getQ3Value("R1", "C1").doubleValue(), + EPSILON); + assertEquals(5.0, dataset.getMinRegularValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(6.0, dataset.getMaxRegularValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(7.0, dataset.getMinOutlier("R1", "C1").doubleValue(), + EPSILON); + assertEquals(8.0, dataset.getMaxOutlier("R1", "C1").doubleValue(), + EPSILON); + assertEquals(new Range(7.0, 8.0), dataset.getRangeBounds(false)); + } + + /** + * Some checks for the add() method. + */ + public void testAddUpdatesCachedRange() { + DefaultBoxAndWhiskerCategoryDataset dataset + = new DefaultBoxAndWhiskerCategoryDataset(); + BoxAndWhiskerItem item1 = new BoxAndWhiskerItem(1.0, 2.0, 3.0, 4.0, + 5.0, 6.0, 7.0, 8.0, new ArrayList()); + dataset.add(item1, "R1", "C1"); + + // now overwrite this item with another + BoxAndWhiskerItem item2 = new BoxAndWhiskerItem(1.5, 2.5, 3.5, 4.5, + 5.5, 6.5, 7.5, 8.5, new ArrayList()); + dataset.add(item2, "R1", "C1"); + + assertEquals(2.5, dataset.getValue("R1", "C1").doubleValue(), EPSILON); + assertEquals(1.5, dataset.getMeanValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(2.5, dataset.getMedianValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(3.5, dataset.getQ1Value("R1", "C1").doubleValue(), + EPSILON); + assertEquals(4.5, dataset.getQ3Value("R1", "C1").doubleValue(), + EPSILON); + assertEquals(5.5, dataset.getMinRegularValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(6.5, dataset.getMaxRegularValue("R1", "C1").doubleValue(), + EPSILON); + assertEquals(7.5, dataset.getMinOutlier("R1", "C1").doubleValue(), + EPSILON); + assertEquals(8.5, dataset.getMaxOutlier("R1", "C1").doubleValue(), + EPSILON); + assertEquals(new Range(7.5, 8.5), dataset.getRangeBounds(false)); + } + + /** + * Some basic checks for the constructor. + */ + public void testConstructor() { + DefaultBoxAndWhiskerCategoryDataset dataset + = new DefaultBoxAndWhiskerCategoryDataset(); + assertEquals(0, dataset.getColumnCount()); + assertEquals(0, dataset.getRowCount()); + assertTrue(Double.isNaN(dataset.getRangeLowerBound(false))); + assertTrue(Double.isNaN(dataset.getRangeUpperBound(false))); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |