summaryrefslogtreecommitdiff
path: root/src/de/ostfalia/algo/ws18/base
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2018-09-29 21:30:09 +0200
committerschneefux <schneefux+commit@schneefux.xyz>2018-09-29 21:30:09 +0200
commit09e85e9945dc39705daba2af992283d0ceb59146 (patch)
tree7321004f76deec01d9edd89b36e2b603e4c30f9f /src/de/ostfalia/algo/ws18/base
downloadautoopstest-master.tar.gz
autoopstest-master.zip
Diffstat (limited to 'src/de/ostfalia/algo/ws18/base')
-rw-r--r--src/de/ostfalia/algo/ws18/base/Gender.java11
-rw-r--r--src/de/ostfalia/algo/ws18/base/IManagement.java81
-rw-r--r--src/de/ostfalia/algo/ws18/base/IMember.java53
-rw-r--r--src/de/ostfalia/algo/ws18/base/KindOfSport.java19
-rw-r--r--src/de/ostfalia/algo/ws18/base/Member.java210
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;
+ }
+}