2. Übungsangabe

Werbung
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
Herunterladen