edu.cmu.tetrad.util.TextTable Maven / Gradle / Ivy
The newest version!
///////////////////////////////////////////////////////////////////////////////
// For information as to what this class does, see the Javadoc, below. //
// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, //
// 2007, 2008, 2009, 2010, 2014, 2015, 2022 by Peter Spirtes, Richard //
// Scheines, Joseph Ramsey, and Clark Glymour. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// This program 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 General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
///////////////////////////////////////////////////////////////////////////////
package edu.cmu.tetrad.util;
/**
* Stores a 2D array of Strings for printing out tables. The table can print out columns either left justified or right
* justified, with a given number of spaces between columns.
*
* @author josephramsey
* @version $Id: $Id
*/
public class TextTable {
/**
* Set justification
to this if the columns should be left justified.
*/
public static final int LEFT_JUSTIFIED = 0;
/**
* Set justification
to this if the columns should be right justified.
*/
public static final int RIGHT_JUSTIFIED = 1;
/**
* The tokens to be printed out.
*/
private final String[][] tokens;
/**
* True if columns should be left justified, false if right justified.
*/
private int justification = TextTable.RIGHT_JUSTIFIED;
/**
* The number of spaces between columns. By default, 2.
*/
private int columnSpacing = 2;
/**
* The delimiter to use when printing the table.
*/
private Delimiter delimiter = Delimiter.JUSTIFIED;
/**
* Construct the text table; the table has a fixed number of rows and columns, each greater than zero.
*
* @param rows a int
* @param columns a int
*/
public TextTable(int rows, int columns) {
if (rows <= 0 || columns <= 0) {
throw new IllegalArgumentException();
}
this.tokens = new String[rows][columns];
for (int i = 0; i < this.tokens.length; i++) {
for (int j = 0; j < this.tokens[0].length; j++) {
this.tokens[i][j] = "";
}
}
}
// private boolean tabDelimited;
/**
* Sets the token at the given row and column, each of which must be >= 0 and less than the number of rows or
* columns, respectively.
*
* @param row a int
* @param column a int
* @param token a {@link java.lang.String} object
*/
public void setToken(int row, int column, String token) {
if (token == null) {
throw new NullPointerException();
}
if (row >= this.tokens.length) {
throw new IllegalArgumentException("Row out of bound " + row + " of " + this.tokens.length);
}
if (column >= this.tokens[0].length) {
throw new IllegalArgumentException("Column out of bound " + column + " of " + this.tokens[0].length);
}
this.tokens[row][column] = token;
}
/**
* getTokenAt.
*
* @param row a int
* @param column a int
* @return the token at the given row and column.
*/
public String getTokenAt(int row, int column) {
return this.tokens[row][column];
}
/**
* getNumRows.
*
* @return the number of rows, as set in the constructor.
*/
public int getNumRows() {
return this.tokens.length;
}
/**
* getNumColumns.
*
* @return the number of rows, as set in the constructor.
*/
public int getNumColumns() {
return this.tokens[0].length;
}
/**
* @return the number of spaces between columns, by default 2.
*/
private int getColumnSpacing() {
return this.columnSpacing;
}
/**
* Sets the number of spaces between columns, to some number >= 0.
*
* @param numSpaces a int
*/
public void setColumnSpacing(int numSpaces) {
if (numSpaces < 0) {
throw new IllegalArgumentException();
}
this.columnSpacing = numSpaces;
}
/**
* @return the justification, either LEFT_JUSTIFIED or RIGHT_JUSTIFIED.
*/
private int getJustification() {
return this.justification;
}
/**
* Sets the justification, either LEFT_JUSTIFIED or RIGHT_JUSTIFIED.
*
* @param justification a int
*/
public void setJustification(int justification) {
if (!(justification == TextTable.LEFT_JUSTIFIED || justification == TextTable.RIGHT_JUSTIFIED)) {
throw new IllegalArgumentException();
}
this.justification = justification;
}
/**
* toString.
*
* @return a {@link java.lang.String} object
*/
public String toString() {
StringBuilder buffer = new StringBuilder();
int[] colWidths = new int[this.tokens[0].length];
for (int j = 0; j < this.tokens[0].length; j++) {
for (String[] token : this.tokens) {
if (token[j].length() > colWidths[j]) {
colWidths[j] = token[j].length();
}
}
}
for (String[] token1 : this.tokens) {
for (int j = 0; j < this.tokens[0].length; j++) {
if (this.delimiter == Delimiter.TAB) {
buffer.append(token1[j]);
if (j < this.tokens[0].length - 1) {
buffer.append("\t");
}
} else if (this.delimiter == Delimiter.COMMA) {
buffer.append(token1[j]);
if (j < this.tokens[0].length - 1) {
buffer.append(",");
}
} else if (this.delimiter == Delimiter.SPACE) {
buffer.append(token1[j]);
if (j < this.tokens[0].length - 1) {
buffer.append(" ");
}
} else {
for (int k = 0; k < getColumnSpacing(); k++) {
buffer.append(' ');
}
int numPaddingSpaces = colWidths[j] - token1[j].length();
if (getJustification() == TextTable.RIGHT_JUSTIFIED) {
for (int k = 0; k < numPaddingSpaces; k++) {
buffer.append(' ');
}
}
buffer.append(token1[j]);
if (getJustification() == TextTable.LEFT_JUSTIFIED) {
for (int k = 0; k < numPaddingSpaces; k++) {
buffer.append(' ');
}
}
}
}
buffer.append("\n");
}
return buffer.toString();
}
/**
* Setter for the field delimiter
.
*
* @param delimiter a {@link edu.cmu.tetrad.util.TextTable.Delimiter} object
*/
public void setDelimiter(Delimiter delimiter) {
this.delimiter = delimiter;
}
/**
* An enum of delimiters.
*/
public enum Delimiter {
/**
* Constant JUSTIFIED
*/
JUSTIFIED,
/**
* Constant COMMA
*/
COMMA,
/**
* Constant TAB
*/
TAB,
/**
* Constant SPACE
*/
SPACE
}
}