/**
* $Id: Dataset.java 4922 2010-05-13 01:09:48Z peterdietz $
* $URL: https://scm.dspace.org/svn/repo/dspace/tags/dspace-1.6.2/dspace-stats/src/main/java/org/dspace/statistics/Dataset.java $
* *************************************************************************
* Copyright (c) 2002-2009, DuraSpace. All rights reserved
* Licensed under the DuraSpace Foundation License.
*
* A copy of the DuraSpace License has been included in this
* distribution and is available at: http://scm.dspace.org/svn/repo/licenses/LICENSE.txt
*/
package org.dspace.statistics;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.Ostermiller.util.ExcelCSVPrinter;
/**
*
* @author kevinvandevelde at atmire.com
* Date: 21-jan-2009
* Time: 13:44:48
*
*/
public class Dataset {
private int nbRows;
private int nbCols;
/* The labels shown in our columns */
private List<String> colLabels;
/* The labels shown in our rows */
private List<String> rowLabels;
private String colTitle;
private String rowTitle;
/* The attributes for the colls */
private List<Map<String, String>> colLabelsAttrs;
/* The attributes for the rows */
private List<Map<String, String>> rowLabelsAttrs;
/* The data in a matrix */
private float[][]matrix;
/* The format in which we format our floats */
private String format = "0";
public Dataset(int rows, int cols){
matrix = new float[rows][cols];
nbRows = rows;
nbCols = cols;
initColumnLabels(cols);
initRowLabels(rows);
}
public Dataset(float[][] matrix){
this.matrix = matrix;
nbRows = matrix.length;
if(0 < matrix.length && 0 < matrix[0].length)
nbCols = matrix[0].length;
initColumnLabels(nbCols);
initRowLabels(nbRows);
}
private void initRowLabels(int rows) {
rowLabels = new ArrayList<String>(rows);
rowLabelsAttrs = new ArrayList<Map<String, String>>();
for (int i = 0; i < rows; i++) {
rowLabels.add("Row " + (i+1));
rowLabelsAttrs.add(new HashMap<String, String>());
}
}
private void initColumnLabels(int nbCols) {
colLabels = new ArrayList<String>(nbCols);
colLabelsAttrs = new ArrayList<Map<String, String>>();
for (int i = 0; i < nbCols; i++) {
colLabels.add("Column " + (i+1));
colLabelsAttrs.add(new HashMap<String, String>());
}
}
public void setColLabel(int n, String label){
colLabels.set(n, label);
}
public void setRowLabel(int n, String label){
rowLabels.set(n, label);
}
public String getRowTitle() {
return rowTitle;
}
public String getColTitle() {
return colTitle;
}
public void setColTitle(String colTitle) {
this.colTitle = colTitle;
}
public void setRowTitle(String rowTitle) {
this.rowTitle = rowTitle;
}
public void setRowLabelAttr(int pos, String attrName, String attr){
Map<String, String> attrs = rowLabelsAttrs.get(pos);
attrs.put(attrName, attr);
rowLabelsAttrs.set(pos, attrs);
}
public void setRowLabelAttr(int pos, Map<String, String> attrMap){
rowLabelsAttrs.set(pos, attrMap);
}
public void setColLabelAttr(int pos, String attrName, String attr){
Map<String, String> attrs = colLabelsAttrs.get(pos);
attrs.put(attrName, attr);
colLabelsAttrs.set(pos, attrs);
}
public void setColLabelAttr(int pos, Map<String, String> attrMap) {
colLabelsAttrs.set(pos, attrMap);
}
public List<Map<String, String>> getColLabelsAttrs() {
return colLabelsAttrs;
}
public List<Map<String, String>> getRowLabelsAttrs() {
return rowLabelsAttrs;
}
public List<String> getColLabels() {
return colLabels;
}
public List<String> getRowLabels() {
return rowLabels;
}
public float[][] getMatrix() {
return matrix;
}
public int getNbRows() {
return nbRows;
}
public int getNbCols() {
return nbCols;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public String[][] getMatrixFormatted(){
DecimalFormat decimalFormat = new DecimalFormat(format);
if (matrix.length == 0) {
return new String[0][0];
} else {
String[][] strMatrix = new String[matrix.length][matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
strMatrix[i][j] = decimalFormat.format(matrix[i][j]);
}
}
return strMatrix;
}
}
public void addValueToMatrix(int row, int coll, float value) {
matrix[row][coll] = value;
}
public void addValueToMatrix(int row, int coll, String value) throws ParseException {
DecimalFormat decimalFormat = new DecimalFormat(format);
Number number = decimalFormat.parse(value);
matrix[row][coll] = number.floatValue();
}
/**
* Returns false if this dataset only contains zero's.
*/
public boolean containsNonZeroValues(){
if (matrix != null) {
for (float[] vector : matrix) {
for (float v : vector) {
if (v != 0)
return true;
}
}
}
return false;
}
public void flipRowCols(){
//Lets make sure we at least have something to flip
if(0 < matrix.length && 0 < matrix[0].length){
//Flip the data first
float[][] newMatrix = new float[matrix[0].length][matrix.length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
newMatrix[j][i] = matrix[i][j];
}
}
//Flip the rows & column labels
List<String> backup = colLabels;
colLabels = rowLabels;
rowLabels = backup;
//Also flip the links
List<Map<String, String>> backList = colLabelsAttrs;
colLabelsAttrs = rowLabelsAttrs;
rowLabelsAttrs = backList;
matrix = newMatrix;
}
//Also flip these sizes
int backUp = nbRows;
nbRows = nbCols;
nbCols = backUp;
//Also flip the title's
String backup = rowTitle;
rowTitle = colTitle;
colTitle = backup;
}
public ByteArrayOutputStream exportAsCSV() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ExcelCSVPrinter ecsvp = new ExcelCSVPrinter(baos);
ecsvp.changeDelimiter(';');
ecsvp.setAlwaysQuote(true);
//Generate the item row
List<String> colLabels = getColLabels();
ecsvp.write("");
for (String colLabel : colLabels) {
ecsvp.write(colLabel);
}
ecsvp.writeln();
List<String> rowLabels = getRowLabels();
String[][] matrix = getMatrixFormatted();
for (int i = 0; i < rowLabels.size(); i++) {
String rowLabel = rowLabels.get(i);
ecsvp.write(rowLabel);
for (int j = 0; j < matrix[i].length; j++) {
ecsvp.write(matrix[i][j]);
}
ecsvp.writeln();
}
ecsvp.flush();
ecsvp.close();
return baos;
}
}