    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2008, 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     * MatrixSeries.java
    029     * -----------------
    030     * (C) Copyright 2003-2008, by Barak Naveh and Contributors.
    031     *
    032     * Original Author:  Barak Naveh;
    033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
    034     *                   Zhitao Wang;
    035     *
    036     * Changes
    037     * -------
    038     * 10-Jul-2003 : Version 1 contributed by Barak Naveh (DG);
    039     * 10-Feb-2004 : Fixed Checkstyle complaints (DG);
    040     * 21-May-2004 : Fixed bug 940188 - problem in getItemColumn() and
    041     *               getItemRow() (DG);
    042     * ------------- JFREECHART 1.0.x ---------------------------------------------
    043     * 27-Nov-2006 : Fixed bug in equals() method (DG);
    044     * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
    045     *
    046     */
    047
    048    package org.jfree.data.xy;
    049
    050    import java.io.Serializable;
    051
    052    import org.jfree.data.general.Series;
    053
    054    /**
    055     * Represents a dense matrix M[i,j] where each Mij item of the matrix has a
    056     * value (default is 0).
    057     */
    058    public class MatrixSeries extends Series implements Serializable {
    059
    060        /** For serialization. */
    061        private static final long serialVersionUID = 7934188527308315704L;
    062
    063        /** Series matrix values */
    064        protected double[][] data;
    065
    066        /**
    067         * Constructs a new matrix series.
    068         * <p>
    069         * By default, all matrix items are initialzed to 0.
    070         * </p>
    071         *
    072         * @param name  series name (<code>null</code> not permitted).
    073         * @param rows  the number of rows.
    074         * @param columns  the number of columns.
    075         */
    076        public MatrixSeries(String name, int rows, int columns) {
    077            super(name);
    078            this.data = new double[rows][columns];
    079            zeroAll();
    080        }
    081
    082        /**
    083         * Returns the number of columns in this matrix series.
    084         *
    085         * @return The number of columns in this matrix series.
    086         */
    087        public int getColumnsCount() {
    088            return this.data[0].length;
    089        }
    090
    091
    092        /**
    093         * Return the matrix item at the specified index.  Note that this method
    094         * creates a new <code>Double</code> instance every time it is called.
    095         *
    096         * @param itemIndex item index.
    097         *
    098         * @return The matrix item at the specified index.
    099         *
    100         * @see #get(int, int)
    101         */
    102        public Number getItem(int itemIndex) {
    103            int i = getItemRow(itemIndex);
    104            int j = getItemColumn(itemIndex);
    105
    106            Number n = new Double(get(i, j));
    107
    108            return n;
    109        }
    110
    111
    112        /**
    113         * Returns the column of the specified item.
    114         *
    115         * @param itemIndex the index of the item.
    116         *
    117         * @return The column of the specified item.
    118         */
    119        public int getItemColumn(int itemIndex) {
    120            //assert itemIndex >= 0 && itemIndex < getItemCount();
    121            return itemIndex % getColumnsCount();
    122        }
    123
    124
    125        /**
    126         * Returns the number of items in the series.
    127         *
    128         * @return The item count.
    129         */
    130        public int getItemCount() {
    131            return getRowCount() * getColumnsCount();
    132        }
    133
    134
    135        /**
    136         * Returns the row of the specified item.
    137         *
    138         * @param itemIndex the index of the item.
    139         *
    140         * @return The row of the specified item.
    141         */
    142        public int getItemRow(int itemIndex) {
    143            //assert itemIndex >= 0 && itemIndex < getItemCount();
    144            return itemIndex / getColumnsCount();
    145        }
    146
    147
    148        /**
    149         * Returns the number of rows in this matrix series.
    150         *
    151         * @return The number of rows in this matrix series.
    152         */
    153        public int getRowCount() {
    154            return this.data.length;
    155        }
    156
    157
    158        /**
    159         * Returns the value of the specified item in this matrix series.
    160         *
    161         * @param i the row of the item.
    162         * @param j the column of the item.
    163         *
    164         * @return The value of the specified item in this matrix series.
    165         *
    166         * @see #getItem(int)
    167         * @see #update(int, int, double)
    168         */
    169        public double get(int i, int j) {
    170            return this.data[i][j];
    171        }
    172
    173
    174        /**
    175         * Updates the value of the specified item in this matrix series.
    176         *
    177         * @param i the row of the item.
    178         * @param j the column of the item.
    179         * @param mij the new value for the item.
    180         *
    181         * @see #get(int, int)
    182         */
    183        public void update(int i, int j, double mij) {
    184            this.data[i][j] = mij;
    185            fireSeriesChanged();
    186        }
    187
    188
    189        /**
    190         * Sets all matrix values to zero and sends a
    191         * {@link org.jfree.data.general.SeriesChangeEvent} to all registered
    192         * listeners.
    193         */
    194        public void zeroAll() {
    195            int rows = getRowCount();
    196            int columns = getColumnsCount();
    197
    198            for (int row = 0; row < rows; row++) {
    199                for (int column = 0; column < columns; column++) {
    200                    this.data[row][column] = 0.0;
    201                }
    202            }
    203            fireSeriesChanged();
    204        }
    205
    206        /**
    207         * Tests this object instance for equality with an arbitrary object.
    208         *
    209         * @param obj  the object (<code>null</code> permitted).
    210         *
    211         * @return A boolean.
    212         */
    213        public boolean equals(Object obj) {
    214            if (obj == this) {
    215                return true;
    216            }
    217            if (!(obj instanceof MatrixSeries)) {
    218                return false;
    219            }
    220            MatrixSeries that = (MatrixSeries) obj;
    221            if (!(getRowCount() == that.getRowCount())) {
    222                return false;
    223            }
    224            if (!(getColumnsCount() == that.getColumnsCount())) {
    225                return false;
    226            }
    227            for (int r = 0; r < getRowCount(); r++) {
    228                for (int c = 0; c < getColumnsCount(); c++) {
    229                    if (get(r, c) != that.get(r, c)) {
    230                        return false;
    231                    }
    232                }
    233            }
    234            return super.equals(obj);
    235        }
    236
    237    }