diff options
Diffstat (limited to 'src/de/ostfalia/algo/ws18/base')
| -rw-r--r-- | src/de/ostfalia/algo/ws18/base/Gender.java | 11 | ||||
| -rw-r--r-- | src/de/ostfalia/algo/ws18/base/IManagement.java | 81 | ||||
| -rw-r--r-- | src/de/ostfalia/algo/ws18/base/IMember.java | 53 | ||||
| -rw-r--r-- | src/de/ostfalia/algo/ws18/base/KindOfSport.java | 19 | ||||
| -rw-r--r-- | src/de/ostfalia/algo/ws18/base/Member.java | 210 |
5 files changed, 374 insertions, 0 deletions
diff --git a/src/de/ostfalia/algo/ws18/base/Gender.java b/src/de/ostfalia/algo/ws18/base/Gender.java new file mode 100644 index 0000000..fe5b4de --- /dev/null +++ b/src/de/ostfalia/algo/ws18/base/Gender.java @@ -0,0 +1,11 @@ +package de.ostfalia.algo.ws18.base;
+
+/**
+ * @author M. Gruendel
+ */
+public enum Gender {
+
+ M,
+ F
+
+}
diff --git a/src/de/ostfalia/algo/ws18/base/IManagement.java b/src/de/ostfalia/algo/ws18/base/IManagement.java new file mode 100644 index 0000000..11091c2 --- /dev/null +++ b/src/de/ostfalia/algo/ws18/base/IManagement.java @@ -0,0 +1,81 @@ +package de.ostfalia.algo.ws18.base;
+
+/**
+ * @author M. Gruendel
+ */
+public interface IManagement {
+
+ /**
+ * Liefert die Anzahl der Datensaetze.
+ * @return Anzahl der Datensaetze: int.
+ */
+ public int size();
+
+
+ /**
+ * Fuegt ein Mitglied dem Datensatz hinzu.
+ * @param member - hinzuzufuegendes Mitglied: IMember.
+ * @return true, wenn das Mitglied hinzugefuegt werden konnte, sonst
+ * false.
+ */
+ public boolean insert(IMember member);
+
+
+ /**
+ * Sucht nach einem Datensatz mit dem angegebenen Schluessel.
+ * @param key - Schluesselwert: long
+ * @return - den gefundenen Datensatz, oder null, wenn der Schluesselwert
+ * nicht gefunden werden konnte: IMember.
+ */
+ public IMember search(long key);
+
+
+ /**
+ * Sucht nach dem ersten Datensatz mit dem angegebenen Namen und Vornamen.
+ * @param name - Nachname des Mitglieds: String.
+ * @param firstName - Vorname des Mitglieds: String.
+ * @return - den gefundenen Datensatz, oder null, wenn der Schluesselwert
+ * nicht gefunden werden konnte: IMember.
+ */
+ public IMember search(String name, String firstName);
+
+
+ /**
+ * Liefert die Anzahl der Datensaetze mit der angegebenen Sportart zurueck.
+ * @param kindOfSport die gesuchte Sportart: KindOfSport.
+ * @return - Anzahl der Datensaetze mit der angegebenen Sportart: int.
+ */
+ public int size(KindOfSport kindOfSport);
+
+
+ /**
+ * Liefert die Datensaetze mit der angegebenen Sportart zurueck.
+ * @param kindOfSport die gesuchte Sportart: KindOfSport.
+ * @return - die Datensaetze mit der angegebenen Sportart: IMember[].
+ */
+ public IMember[] discipline(KindOfSport kindOfSport);
+
+ /**
+ * Liefert alle Datensaetze als Array von IMember zurueck.
+ * @return - alle Datensaetze als Array: IMember[].
+ */
+ public IMember[] toArray();
+
+ /**
+ * Liefert die Anzahl grundlegenden Operationen bei der zuvor aufgerufenen
+ * Zugriffsmethode zurueck.
+ * @return - Anzahl grundlegenden Operationen bei der zuvor aufgerufenen
+ * Zugriffsmethode: int.
+ */
+ public int numberOfOperations();
+
+
+ /**
+ * Nur fuer Aufgabe 3: liefert die Hoehe des binaeren Suchbaums zurueck.
+ * @return - die Hoehe des binaeren Suchbaums: int.
+ */
+ public default int height() {
+ return 0;
+ };
+
+}
diff --git a/src/de/ostfalia/algo/ws18/base/IMember.java b/src/de/ostfalia/algo/ws18/base/IMember.java new file mode 100644 index 0000000..e579ad7 --- /dev/null +++ b/src/de/ostfalia/algo/ws18/base/IMember.java @@ -0,0 +1,53 @@ +package de.ostfalia.algo.ws18.base;
+
+import java.time.LocalDate;
+
+/**
+ * @author M. Gruendel
+ */
+public interface IMember extends Comparable<IMember> {
+
+ /**
+ * Liefert den Schluesselwert zurueck.
+ * @return - den Schluesselwert: int.
+ */
+ public long getKey();
+
+ /**
+ * Liefert den Nachnamen des Mitglieds zurueck.
+ * @return - den Nachnamen des Mitglieds: String.
+ */
+ public String getName();
+
+ /**
+ * Liefert den Vornamen des Mitglieds zurueck.
+ * @return - den Vornamen des Mitglieds: String.
+ */
+ public String getFirstName();
+
+ /**
+ * Liefert das Geschlecht des Mitglieds zurueck.
+ * @return Geschlecht des Mitglieds: Gender.
+ */
+ public Gender getGender();
+
+ /**
+ * Liefert das Geburtsdatum des Mitglieds zurueck.
+ * @return Geburtsdatum des Mitglieds: LocalDate.
+ */
+ public LocalDate getDate();
+
+ /**
+ * liefert die Sportart zurueck.
+ * @return - die Sportart: KindOfSport;
+ */
+ public KindOfSport getKindOfSport();
+
+ /**
+ * Liefert den Datensatz inklusive Schluesselwert als String zurueck.<br><br>
+ * Beispiel: "82115101922, Hueber, Uta, 1922-10-15, F, HANDBALL"
+ * @return Datensatz inklusive Schluesselwert: String.
+ */
+ public String toString();
+
+}
diff --git a/src/de/ostfalia/algo/ws18/base/KindOfSport.java b/src/de/ostfalia/algo/ws18/base/KindOfSport.java new file mode 100644 index 0000000..f6e43d0 --- /dev/null +++ b/src/de/ostfalia/algo/ws18/base/KindOfSport.java @@ -0,0 +1,19 @@ +package de.ostfalia.algo.ws18.base;
+
+/**
+ * @author M. Gruendel
+ */
+public enum KindOfSport {
+
+ FUSSBALL,
+ HANDBALL,
+ SCHWIMMEN,
+ LEICHTATHLETIK,
+ REITEN,
+ FECHTEN,
+ TURNEN,
+ RADSPORT,
+ TANZEN,
+ RUDERN
+
+}
diff --git a/src/de/ostfalia/algo/ws18/base/Member.java b/src/de/ostfalia/algo/ws18/base/Member.java new file mode 100644 index 0000000..5e24b81 --- /dev/null +++ b/src/de/ostfalia/algo/ws18/base/Member.java @@ -0,0 +1,210 @@ +package de.ostfalia.algo.ws18.base; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class Member implements IMember { + /** + * Schlüssel kodiert als: + * Anfangsbuchstabe des Namens, codiert in + * zwei Dezimalziffern a -> 01, b -> 02, …, z -> 26. + * Diese Zuordnung gilt für Groß- und Kleinbuchstaben, + * Umlaute werden als ae, oe, ue dargestellt. + * Anfangsbuchstabe des Vornamens, codiert in + * zwei Dezimalziffern, siehe Name + * Geburtsdatum, ttmmjjjj + * + * Sie können davon ausgehen, dass doppelte Schlüssel nicht vorkommen. + */ + private long key; + + /** + * Name. + */ + private String name; + + /** + * Firstname. + */ + private String firstname; + + /** + * Date. + */ + private LocalDate date; + + /** + * Gender. + */ + private Gender gender; + + /** + * Associated kind of sport. + */ + private KindOfSport kindOfSport; + + /** + * Parse a CSV to a Member. + * + * @param csv A CSV String separated by ', ', + * with the row signature 'name, firstname, date, gender, kind of sport' + * @return A Member. + */ + public Member(String csv) { + final String DELIMITER = ", "; + String[] columns = csv.split(DELIMITER); + + if (columns.length != 5) { + throw new IllegalArgumentException( + "Row '" + csv + "' is not a valid format!"); + } + + this.name = columns[0]; + this.firstname = columns[1]; + this.date = LocalDate.parse(columns[2], + DateTimeFormatter.ISO_DATE); + this.gender = Gender.valueOf(columns[3]); + this.kindOfSport = KindOfSport.valueOf(columns[4]); + this.key = encode(this); + } + + /** + * Member constructor. + * + * @param name The name. + * @param firstname The firstname. + * @param date The date. + * @param gender The gender. + * @param kindOfSport The associated kind of sport. + */ + public Member(String name, + String firstname, + LocalDate date, + Gender gender, + KindOfSport kindOfSport) { + this.name = name; + this.firstname = firstname; + this.date = date; + this.gender = gender; + this.kindOfSport = kindOfSport; + this.key = encode(this); + } + + /** + * Generate a unique key from a member's attributes. + * + * @param member A member. + * @return A key. + */ + private static Long encode(Member member) { + String nameKeyPart = encodeLetters(member.name.substring(0, 1)); + String surnameKeyPart = encodeLetters(member.firstname.substring(0, 1)); + String dateKeyPart = encodeDate(member.date); + String key = nameKeyPart + surnameKeyPart + dateKeyPart; + return Long.valueOf(key); + } + + /** + * Format the given date as part of a key. + * + * @param date A LocalDate. + * @return A String ttmmjjjj. + */ + private static String encodeDate(LocalDate date) { + return String.format("%02d%02d%02d", // 2 digits, left pad + date.getDayOfMonth(), + date.getMonthValue(), + date.getYear()); + } + + /** + * Map each letter in the given string to a value + * between '01' and '26'. + * + * @param string A string containing only letters. + * @return A string of zero padded digits. + */ + private static String encodeLetters(String string) { + String encodedString = ""; + + for (char letter : sanitizeLetters(string).toCharArray()) { + int letterIndex = letter - 'a' + 1; + + if (letterIndex < 1 || letterIndex > 26) { + throw new IllegalArgumentException( + letter + " cannot be encoded!"); + } + + encodedString += String.format("%02d", letterIndex); + } + + return encodedString; + } + + /** + * Replace ä, ö, ü and lowercase the string. + * + * @param string A string. + * @return A lowercase string without umlauts. + */ + private static String sanitizeLetters(String string) { + return string + .toLowerCase() + .replace("ä", "ae") + .replace("ö", "oe") + .replace("ü", "ue"); + } + + /** + * Return this member as string. + */ + @Override + public String toString() { + return this.key + ", " + + this.name + ", " + + this.firstname + ", " + + this.date + ", " + + this.gender + ", " + + this.kindOfSport; + } + + /** + * Implement the Comparable interface by comparing the keys. + * + * @return @see Comparable + */ + @Override + public int compareTo(IMember member) { + return Long.compare(this.key, member.getKey()); + } + + @Override + public String getName() { + return this.name; + } + + @Override + public Gender getGender() { + return this.gender; + } + + @Override + public LocalDate getDate() { + return this.date; + } + + @Override + public String getFirstName() { + return this.firstname; + } + + @Override + public long getKey() { + return this.key; + } + + @Override + public KindOfSport getKindOfSport() { + return this.kindOfSport; + } +} |
