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" );