summaryrefslogtreecommitdiff
path: root/src/de/ostfalia/algo/ws18/base/Member.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/ostfalia/algo/ws18/base/Member.java')
-rw-r--r--src/de/ostfalia/algo/ws18/base/Member.java210
1 files changed, 210 insertions, 0 deletions
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;
+ }
+}