Next Previous Up Contents
Next: Random Access
Up: Table Data
Previous: Table Data

#### 2.3.1 Sequential Access

It is always possible to access a table's data sequentially, that is starting with the first row and reading forward a row at a time to the last row; it may or may not be possible to tell in advance (using `getRowCount`) how many rows there are. To perform sequential access, use the `getRowSequence` method to get a `RowSequence` object, which is an iterator over the rows in the table. The `RowSequence`'s `next` method moves forward a row without returning any data; to obtain the data use either `getCell` or `getRow`; the relative efficiencies of these depend on the implementation, but in general if you want all or nearly all of the values in a row it is a good idea to use `getRow`, if you just want one or two use `getCell`. You cannot move the iterator backwards. When obtained, a `RowSequence` is positioned before the first row in the table, so (unlike an `Iterator`) it is necessary to call `next` before the first row is accessed.

Here is an example of how to sum the values in one of the numeric columns of a table. Since only one value is required from each row, `getCell` is used:

        double sumColumn( StarTable table, int icol ) throws IOException {

            // Check that the column contains values that can be cast to Number.
            ColumnInfo colInfo = table.getColumnInfo( icol );
            Class colClass = colInfo.getContentClass();
            if ( ! Number.class.isAssignableFrom( colClass ) ) {
                throw new IllegalArgumentException( "Column not numeric" );
            }

            // Iterate over rows accumulating the total.
            double sum = 0.0;
            RowSequence rseq = table.getRowSequence();
            while ( rseq.next() ) {
                Number value = (Number) rseq.getCell( icol );
                sum += value.doubleValue();
            }
            rseq.close();
            return sum;
        }

The next example prints out every cell value. Since it needs all the values in each cell, it uses `getRow`:

        void writeTable( StarTable table ) throws IOException {
            int nCol = table.getColumnCount();
            RowSequence rseq = table.getRowSequence();
            while ( rseq.next() ) {
                Object[] row = rseq.getRow();
                for ( int icol = 0; icol < nCol; icol++ ) {
                    System.out.print( row[ icol ] + "\t" );
                }
                System.out.println();
            }
            rseq.close();
        }

In this case a tidier representation of the values might be given by replacing the `print` call with:

        System.out.print( table.getColumnInfo( icol )
                               .formatValue( row[ icol ], 20 ) + "\t" );

Next Previous Up Contents
Next: Random Access
Up: Table Data
Previous: Table Data

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