Matrix.java

package edu.hawaii.ics.yucheng;

import java.util.ArrayList;

/**
 * A generic matrix class.
 * 
 * @param <T> The type stored as matrix elements.
 */
class Matrix<T> {
    private final ArrayList<T> myArray;
    private final int          myColumns;
    private final int          myRows;


    /**
     * Initializes a new instance of the class.
     * 
     * @param rows The number of rows.
     * 
     * @param columns The number of columns.
     * 
     * @param defaultValue The default value.
     */
    public Matrix(final int rows, final int columns, final T defaultValue) {
        if (rows <= 0)
            throw new IllegalArgumentException("rows");
        if (columns <= 0)
            throw new IllegalArgumentException("columns");

        // Store the fields, and initialize the array.
        myColumns = columns;
        myRows = rows;
        myArray = new ArrayList<T>(rows * columns);
        for (int r = 0; r < rows; r++)
            for (int c = 0; c < columns; c++)
                myArray.add(defaultValue);
    }


    /**
     * Clones a matrix.
     * 
     * @param matrix The matrix to clone.
     */
    protected Matrix(final Matrix<T> matrix) {
        myColumns = matrix.myColumns;
        myRows = matrix.myRows;
        myArray = new ArrayList<T>(matrix.myArray);
    }


    /**
     * Returns a clone of the matrix.
     * 
     * @return A clone of the matrix.
     */
    @Override
    public Matrix<T> clone() {
        return new Matrix<T>(this);
    }


    /**
     * Returns the number of columns.
     * 
     * @return The number of columns.
     */
    public int columns() {
        return myColumns;
    }


    /**
     * Returns the element value at a specified position.
     * 
     * @param row The row.
     * 
     * @param column The column.
     * 
     * @return The element.
     */
    public T get(final int row, final int column) {
        if (row < 0 || row >= myRows)
            throw new IndexOutOfBoundsException("row");
        if (column < 0 || column >= myColumns)
            throw new IndexOutOfBoundsException("column");

        return myArray.get(row * myRows + column);
    }


    /**
     * Returns the number of rows.
     * 
     * @return The number of rows.
     */
    public int rows() {
        return myRows;
    }


    /**
     * Sets the element value at the specified position.
     * 
     * @param row The row.
     * 
     * @param column The column.
     * 
     * @param value The value.
     */
    public void set(final int row, final int column, final T value) {
        if (row < 0 || row >= myRows)
            throw new IndexOutOfBoundsException("row");
        if (column < 0 || column >= myColumns)
            throw new IndexOutOfBoundsException("column");

        myArray.set(row * myRows + column, value);
    }


    /**
     * Returns the string representation of the class.
     * 
     * @return The string representation of the class.
     */
    @Override
    public String toString() {
        final StringBuilder builder = new StringBuilder();

        builder.append("{");
        for (int row = 0; row < myRows; row++) {
            builder.append(" {");
            for (int column = 0; column < myColumns; column++)
                builder.append(" " + get(row, column).toString());
            builder.append(" }");
            if (row + 1 < myColumns)
                builder.append("\n ");
        }
        builder.append(" }");

        return builder.toString();
    }
}
Valid HTML 4.01 Valid CSS