001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * ------------------
028     * DataUtilities.java
029     * ------------------
030     * (C) Copyright 2003-2007, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * Changes
036     * -------
037     * 05-Mar-2003 : Version 1 (DG);
038     * 03-Mar-2005 : Moved createNumberArray() and createNumberArray2D() methods
039     *               from the DatasetUtilities class (DG);
040     * 17-May-2005 : Added calculateColumnTotal() and calculateRowTotal() 
041     *               methods (DG);
042     * 
043     */
044    
045    package org.jfree.data;
046    
047    import org.jfree.data.general.DatasetUtilities;
048    
049    /**
050     * Utility methods for use with some of the data classes (but not the datasets, 
051     * see {@link DatasetUtilities}).
052     */
053    public abstract class DataUtilities {
054    
055        /**
056         * Returns the total of the values in one column of the supplied data
057         * table.
058         * 
059         * @param data  the table of values (<code>null</code> not permitted).
060         * @param column  the column index (zero-based).
061         * 
062         * @return The total of the values in the specified column.
063         */
064        public static double calculateColumnTotal(Values2D data, int column) {
065            double total = 0.0;
066            int rowCount = data.getRowCount();
067            for (int r = 0; r < rowCount; r++) {
068                Number n = data.getValue(r, column);
069                if (n != null) {
070                    total += n.doubleValue();   
071                }
072            }
073            return total;
074        }
075        
076        /**
077         * Returns the total of the values in one row of the supplied data
078         * table.
079         * 
080         * @param data  the table of values (<code>null</code> not permitted).
081         * @param row  the row index (zero-based).
082         * 
083         * @return The total of the values in the specified row.
084         */
085        public static double calculateRowTotal(Values2D data, int row) {
086            double total = 0.0;
087            int columnCount = data.getColumnCount();
088            for (int c = 0; c < columnCount; c++) {
089                Number n = data.getValue(row, c);
090                if (n != null) {
091                    total += n.doubleValue();   
092                }
093            }
094            return total;
095        }
096        
097        /**
098         * Constructs an array of <code>Number</code> objects from an array of 
099         * <code>double</code> primitives.
100         *
101         * @param data  the data (<code>null</code> not permitted).
102         *
103         * @return An array of <code>Double</code>.
104         */
105        public static Number[] createNumberArray(double[] data) {
106            if (data == null) {
107                throw new IllegalArgumentException("Null 'data' argument.");   
108            }
109            Number[] result = new Number[data.length];
110            for (int i = 0; i < data.length; i++) {
111                result[i] = new Double(data[i]);
112            }
113            return result;
114        }
115    
116        /**
117         * Constructs an array of arrays of <code>Number</code> objects from a 
118         * corresponding structure containing <code>double</code> primitives.
119         *
120         * @param data  the data (<code>null</code> not permitted).
121         *
122         * @return An array of <code>Double</code>.
123         */
124        public static Number[][] createNumberArray2D(double[][] data) {
125            if (data == null) {
126                throw new IllegalArgumentException("Null 'data' argument.");   
127            }
128            int l1 = data.length;
129            Number[][] result = new Number[l1][];
130            for (int i = 0; i < l1; i++) {
131                result[i] = createNumberArray(data[i]);
132            }
133            return result;
134        }
135    
136        /**
137         * Returns a {@link KeyedValues} instance that contains the cumulative 
138         * percentage values for the data in another {@link KeyedValues} instance.
139         * <p>
140         * The percentages are values between 0.0 and 1.0 (where 1.0 = 100%).
141         *
142         * @param data  the data (<code>null</code> not permitted).
143         *
144         * @return The cumulative percentages.
145         */
146        public static KeyedValues getCumulativePercentages(KeyedValues data) {
147            if (data == null) {
148                throw new IllegalArgumentException("Null 'data' argument.");   
149            }
150            DefaultKeyedValues result = new DefaultKeyedValues();
151            double total = 0.0;
152            for (int i = 0; i < data.getItemCount(); i++) {
153                Number v = data.getValue(i);
154                if (v != null) {
155                    total = total + v.doubleValue();
156                }
157            }
158            double runningTotal = 0.0;
159            for (int i = 0; i < data.getItemCount(); i++) {
160                Number v = data.getValue(i);
161                if (v != null) {
162                    runningTotal = runningTotal + v.doubleValue();
163                }
164                result.addValue(data.getKey(i), new Double(runningTotal / total));
165            }
166            return result;
167        }
168    
169    }