Next Previous Up Contents
Next: Add a new column
Up: Examples
Previous: Sorted Table

#### 6.4.2 Turn a set of arrays into a StarTable

Suppose you have three arrays representing a set of points on the plane, giving an index number and an x and y coordinate, and you would like to manipulate them as a StarTable. One way is to use the `ColumnStarTable` class, which gives you a table of a specified number of rows but initially no columns, to which you can add data a column at a time. Each added column is an instance of `ColumnData`; the `ArrayColumn` class provides a convenient implementation which wraps an array of objects or primitives (one element per row).

        StarTable makeTable( int[] index, double[] x, double[] y ) {
            int nRow = index.length;
            ColumnStarTable table = ColumnStarTable.makeTableWithRows( nRow );
            table.addColumn( ArrayColumn.makeColumn( "Index", index ) );
            table.addColumn( ArrayColumn.makeColumn( "x", x ) );
            table.addColumn( ArrayColumn.makeColumn( "y", y ) );
            return table;
        }

A more general way to approach this is to write a new implementation of `StarTable`; this is like what happens in Swing if you write your own `TableModel` to provide data for a `JTable`. In order to do this you will usually want to subclass one of the existing implementations, probably `AbstractStarTable`, `RandomStarTable` or `WrapperStarTable`. Here is how it can be done:

        class PointsStarTable extends RandomStarTable {

            // Define the metadata object for each of the columns.
            ColumnInfo[] colInfos_ = new ColumnInfo[] {
                new ColumnInfo( "Index", Integer.class, "point index" ),
                new ColumnInfo( "X", Double.class, "x co-ordinate" ),
                new ColumnInfo( "Y", Double.class, "y co-ordinate" ),
            };

            // Member variables are arrays holding the actual data.
            int[] index_;
            double[] x_;
            double[] y_;
            long nRow_;

            public PointsStarTable( int[] index, double[] x, double[] y ) {
                index_ = index;
                x_ = x;
                y_ = y;
                nRow_ = (long) index_.length;
            }

            public int getColumnCount() {
                return 3;
            }

            public long getRowCount() {
                return nRow_;
            }

            public ColumnInfo getColumnInfo( int icol ) {
                return colInfos_[ icol ];
            }

            public Object getCell( long lrow, int icol ) {
                int irow = checkedLongToInt( lrow );
                switch ( icol ) {
                    case 0: return new Integer( index_[ irow ] );
                    case 1: return new Double( x_[ irow ] );
                    case 2: return new Double( y_[ irow ] );
                    default: throw new IllegalArgumentException();
                }
            }
        }

In this case it is only necessary to implement the `getCell` method; `RandomStarTable` implements the other data access methods (`getRow`, `getRowSequence`, `getRowAccess`) in terms of this. Note that for more complicated behaviour, more methods may need to be implemented.

Next Previous Up Contents
Next: Add a new column
Up: Examples
Previous: Sorted Table

STIL - Starlink Tables Infrastructure Library
Starlink User Note252
STIL web page: http://www.starlink.ac.uk/stil/
Author email: m.b.taylor@bristol.ac.uk