// $Id: GeneralTable.java,v 1.5 2009/10/26 23:29:40 cmzmasek Exp $
// FORESTER -- software libraries and applications
// for evolutionary biology research and applications.
//
// Copyright (C) 2008-2009 Christian M. Zmasek
// Copyright (C) 2008-2009 Burnham Institute for Medical Research
// All rights reserved
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
//
// Contact: cmzmasek@yahoo.com
// WWW: www.phylosoft.org
package org.forester.util;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
public class GeneralTable<IDENTIFIER_TYPE, VALUE_TYPE> {
private Map<IDENTIFIER_TYPE, Map<IDENTIFIER_TYPE, VALUE_TYPE>> _rows;
private SortedSet<IDENTIFIER_TYPE> _row_identifiers;
private SortedSet<IDENTIFIER_TYPE> _column_identifiers;
public GeneralTable() {
init();
}
public SortedSet<IDENTIFIER_TYPE> getColumnIdentifiers() {
return _column_identifiers;
}
private Map<IDENTIFIER_TYPE, VALUE_TYPE> getRow( final IDENTIFIER_TYPE row ) {
return getRows().get( row );
}
public SortedSet<IDENTIFIER_TYPE> getRowIdentifiers() {
return _row_identifiers;
}
private Map<IDENTIFIER_TYPE, Map<IDENTIFIER_TYPE, VALUE_TYPE>> getRows() {
return _rows;
}
public VALUE_TYPE getValue( final IDENTIFIER_TYPE col, final IDENTIFIER_TYPE row ) throws IllegalArgumentException {
final Map<IDENTIFIER_TYPE, VALUE_TYPE> row_map = getRow( row );
if ( ( row_map == null ) || ( row_map.size() < 1 ) ) {
return null;
}
return row_map.get( col );
}
public String getValueAsString( final IDENTIFIER_TYPE col, final IDENTIFIER_TYPE row )
throws IllegalArgumentException {
final VALUE_TYPE value = getValue( col, row );
return ( value == null ? "" : getValue( col, row ).toString() );
}
private void init() {
_rows = new HashMap<IDENTIFIER_TYPE, Map<IDENTIFIER_TYPE, VALUE_TYPE>>();
_row_identifiers = new TreeSet<IDENTIFIER_TYPE>();
_column_identifiers = new TreeSet<IDENTIFIER_TYPE>();
}
public void setValue( final IDENTIFIER_TYPE col, final IDENTIFIER_TYPE row, final VALUE_TYPE value ) {
getColumnIdentifiers().add( col );
getRowIdentifiers().add( row );
Map<IDENTIFIER_TYPE, VALUE_TYPE> row_map = null;
if ( getRows().containsKey( row ) ) {
row_map = getRows().get( row );
}
else {
row_map = new HashMap<IDENTIFIER_TYPE, VALUE_TYPE>();
getRows().put( row, row_map );
}
row_map.put( col, value );
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "\t" );
for( final IDENTIFIER_TYPE col : getColumnIdentifiers() ) {
sb.append( col.toString() );
sb.append( "\t" );
}
sb.append( ForesterUtil.LINE_SEPARATOR );
for( final IDENTIFIER_TYPE row : getRowIdentifiers() ) {
sb.append( row.toString() );
sb.append( "\t" );
for( final IDENTIFIER_TYPE col : getColumnIdentifiers() ) {
sb.append( getValueAsString( col, row ) );
sb.append( "\t" );
}
sb.append( ForesterUtil.LINE_SEPARATOR );
}
return sb.toString();
}
public String toString( final NumberFormat number_format ) {
final StringBuilder sb = new StringBuilder();
sb.append( "\t" );
for( final IDENTIFIER_TYPE col : getColumnIdentifiers() ) {
sb.append( col.toString() );
sb.append( "\t" );
}
sb.append( ForesterUtil.LINE_SEPARATOR );
for( final IDENTIFIER_TYPE row : getRowIdentifiers() ) {
sb.append( row.toString() );
sb.append( "\t" );
for( final IDENTIFIER_TYPE col : getColumnIdentifiers() ) {
try {
sb.append( number_format.format( getValue( col, row ) ) );
}
catch ( final IllegalArgumentException e ) {
sb.append( getValueAsString( col, row ) );
}
sb.append( "\t" );
}
sb.append( ForesterUtil.LINE_SEPARATOR );
}
return sb.toString();
}
}