1 package org.djutils.data; 2 3 import org.djutils.base.Identifiable; 4 import org.djutils.immutablecollections.ImmutableList; 5 6 /** 7 * Table with data stored in structured records. 8 * <p> 9 * Copyright (c) 2020-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br> 10 * BSD-style license. See <a href="https://opentrafficsim.org/docs/current/license.html">OpenTrafficSim License</a>. 11 * </p> 12 * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a> 13 * @author <a href="https://www.tudelft.nl/pknoppers">Peter Knoppers</a> 14 * @author <a href="https://www.transport.citg.tudelft.nl">Wouter Schakel</a> 15 */ 16 public interface DataTable extends Iterable<DataRecord>, Identifiable 17 { 18 19 /** 20 * Returns the description. 21 * @return description 22 */ 23 String getDescription(); 24 25 /** 26 * Returns the list of columns. 27 * @return list of columns 28 */ 29 ImmutableList<DataColumn<?>> getColumns(); 30 31 /** 32 * Returns the number of columns. 33 * @return number of columns 34 */ 35 default int getNumberOfColumns() 36 { 37 return getColumns().size(); 38 } 39 40 /** 41 * Returns whether the table is empty. 42 * @return whether the table is empty 43 */ 44 boolean isEmpty(); 45 46 /** 47 * Return the column ids as a String[]. 48 * @return String[]; the column ids 49 */ 50 default String[] getColumnIds() 51 { 52 String[] headers = new String[getNumberOfColumns()]; 53 int index = 0; 54 for (DataColumn<?> column : getColumns()) 55 { 56 headers[index++] = column.getId(); 57 } 58 return headers; 59 } 60 61 /** 62 * Return the column descriptions as a String[]. 63 * @return String[] the column headers 64 */ 65 default String[] getColumnDescriptions() 66 { 67 String[] descriptions = new String[getNumberOfColumns()]; 68 int index = 0; 69 for (DataColumn<?> column : getColumns()) 70 { 71 descriptions[index++] = column.getDescription(); 72 } 73 return descriptions; 74 } 75 76 /** 77 * Return the column data types as a Class<?>[]. 78 * @return Class<?>[] the column data types 79 */ 80 default Class<?>[] getColumnDataTypes() 81 { 82 Class<?>[] dataTypes = new Class[getNumberOfColumns()]; 83 int index = 0; 84 for (DataColumn<?> column : getColumns()) 85 { 86 dataTypes[index++] = column.getValueType(); 87 } 88 return dataTypes; 89 } 90 91 /** 92 * Return the column data types as a String[]. Each data type is presented as the full class name or the primitive name. In 93 * case of an array, the result is preceded by an "[" for each dimension. After one or more "[" symbols, the class name is 94 * preceded by an "L" for a non-primitive class or interface, and by "I" for integer, "Z" for boolean, "B" for byte, "C" for 95 * char, "D" for double, "F" for float, "J" for long and "S" for short. So for a column with a double, "double" is returned. 96 * For a column with a "Double", "java.lang.Double" is returned, for an int[][], "[[I" is returned, and for a Long[], 97 * "[Ljava.lang.Long" is returned. 98 * @return String[] the column data types as an array of Strings 99 */ 100 default String[] getColumnDataTypeStrings() 101 { 102 String[] dataTypes = new String[getNumberOfColumns()]; 103 int index = 0; 104 for (DataColumn<?> column : getColumns()) 105 { 106 dataTypes[index++] = column.getValueType().getName(); 107 } 108 return dataTypes; 109 } 110 111 }