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