Praktikum aus Softwareentwicklung 2 SS 2008, LVA 365.009 Abgabetermin: 15.4.2008 Erreichbare Punkte: 24+10 Übung 2 Aufgabe 1: Daten Tabelle 24 Punkte Tabellarische Daten sollten durch entschsprechende Utility Klassen abgebildet werden. Diese Klassen sollten folgende Features implementieren: 1. Von einer Textdatei importieren (scan) 2. In eine Textdatei exportieren (die wieder importiert werden kann) 3. Spalten mit unterschiedlichen Typen erlauben (boolean, int, float, String) 4. Nach einer bestimmten Spalte sortieren 5. Spalten löschen 6. Spalten hinzufügen 7. Formatierte Ausgabe 8. Werte einzelner Zellen ändern 9. Untersützung von NULL-Werten (leere Zellen) Das Text Format ist folgendermassen definiert: Die 1. Zeile liefert den jeweiligen Spaltentyp und –Namen getrennt durch ':'. Die Informationen zu jeder Spalte sind getrennt durch ';' – zum Beispiel: int:Laufende Nummer;string:Name;string:Matrikelnummer Die darauf folgenden Zeilen sind die Daten dazu, ebenfalls durch ';' getrennt, zum Beispiel: 1;Name01;9087655 2;Name02;9299876 … Die formatierte Ausgabe sollte dann mit Spaltennamen und dem Typ erfolgen. Die Werte sollten nach Spalten linksbündig ausgerichtet sein: Laufende Nummer (int) 1 2 Name (String) Name01 Name02 Matrikelnummer (String) 9087655 9299876 Falls die Tabelle nach einer bestimmten Spalte sortiert ist, sollte natürlich auch die Ausgabe (formatiert bzw. Export in Text Format) entsprechend erfolgen. Bilden Sie die Tabelle mit folgenden Klassen ab und testen Sie ihre Implementierung mit allen erlaubten Typen: - Grid (die gesamte Tabelle) - Column (einzelne Spalte) Seite 1/3 - Cell (einzelne Zelle) Die Methoden dazu könnten folgendermassen aussehen – ist ein Vorschlag, den Sie bei Bedarf ergänzen oder auch abwandeln können: public class Grid { private List<Column> columns; private int sortedColIndex; public Grid(List<Column> columns, …) {…} public static Grid import(InputStream in) {…} public void export(OutputStream out) {…} public void printf(PrintWriter out) {…} public void addColumn(List<Column> columns) {…} public void deleteColumn(List<Column> columns) {…} public void sortByColumn(int columnIndex) {…} public <T> Column<T> getColumn(int colIndex) {…} public List<Column> getColumns() {…} } public class Column<T> { public enum Type { BOOL, INT, FLOAT, STRING } private List<Cell<T>> values; private String name; private Type type; public Column(ArrayList<Cell<T>> values, String name, Type type) {…} public List<Cell<T>> getCells() {…} public T getValue(int rowIndex) {…} public Type getType() {…} } public class Cell<T> { private T value; private int originalRow; // Zeilenindex beim Erzeugen // der Tabelle (z.b. beim Einlesen) public Cell(T value, int originalRow) {…} public T getValue() {…} public void setValue(T value) {…} public int getOriginalRow() {…} } Prüfen Sie in jenen Methoden an die Indizes als Parameter übergeben werden, ob diese gültige Werte besitzen. Falls nicht, soll eine IllegalArgumentException mit einer entsprechenden Meldung ausgelöst werden. Zum Importieren einer Tabelle soll java.util.Scanner verwendet werden, java.util.Formatter analog für den Export. Seite 2/3 Hinweis: Für Listen ist java.util.ArrayList sehr praktisch, da diese random access, also Zugriff via Index anbieten. Um das Sortieren effizient zu implementieren genügt es nur die jeweilige Spalte zu sortieren und bei der Ausgabe (export, printf) über Cell.originalRow die richtigen Werte der übrigen Spalten direkt auszulesen (siehe auch java.util.Collections). Freiwillige Zusatzaufgabe 10 Punkte Erweitern Sie die Implementierung so, dass das Sortieren nach einem zusammengestztem Kriterium möglich ist, also nach mehreren Spalten sortiert werden kann, z. B. folgende Tabelle sortiert nach A und C ergibt: A aaa aaa kkk B xxx bbb rrr C eee ggg aaa Seite 3/3 D 999 777 333 E 666 888 222