summaryrefslogtreecommitdiff
path: root/AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java
diff options
context:
space:
mode:
Diffstat (limited to 'AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java')
-rw-r--r--AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java b/AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java
new file mode 100644
index 0000000..8630615
--- /dev/null
+++ b/AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java
@@ -0,0 +1,152 @@
+package de.ostfalia.algo.ws18.s1;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Optional;
+import java.util.function.Predicate;
+
+import de.ostfalia.algo.ws18.base.Gender;
+import de.ostfalia.algo.ws18.base.IManagement;
+import de.ostfalia.algo.ws18.base.IMember;
+import de.ostfalia.algo.ws18.base.KindOfSport;
+
+public class Management implements IManagement {
+ private int numberOfOperations = 0;
+
+ private Optional<LinkedListNode<IMember>> head = Optional.empty();
+ private int size = 0;
+ boolean reversed = false;
+
+ public Management() {
+ }
+
+ public Management(String[] membersCsv) {
+ for (String memberCsv : membersCsv) {
+ this.insert(new Member(memberCsv));
+ }
+ }
+
+ public Management(String filename) {
+ this.importFromFile(filename);
+ }
+
+ private void importFromFile(String filename) {
+ File file = new File(filename);
+
+ try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
+ bufferedReader.lines().forEach(line -> insert(new Member(line)));
+ } catch (IOException exception) {
+ throw new IllegalArgumentException(exception);
+ }
+ }
+
+ @Override
+ public int size() {
+ return this.size;
+ }
+
+ @Override
+ public boolean insert(IMember value) {
+ this.numberOfOperations++;
+
+ LinkedListNode<IMember> newHead = new LinkedListNode<IMember>(value);
+ if (this.head.isPresent()) {
+ newHead.setNext(this.head.get());
+ }
+ this.head = Optional.of(newHead);
+
+ this.size++;
+ return true; // TODO?
+ }
+
+ private Management filter(Predicate<IMember> criteria, boolean breakAfterFirstMatch) {
+ Management result = new Management();
+ if (!this.head.isPresent()) {
+ return result;
+ }
+
+ // searches from head, inserts at head -> result is reversed
+ result.reverse();
+
+ LinkedListNode<IMember> currentNode = this.head.get();
+ do {
+ this.numberOfOperations++;
+
+ IMember currentValue = currentNode.getValue();
+ if (criteria.test(currentValue)) {
+ result.insert(currentValue);
+ if (breakAfterFirstMatch) {
+ break;
+ }
+ }
+ } while ((currentNode = currentNode.getNext()) != null);
+
+ return result;
+ }
+
+ private Optional<IMember> search(Predicate<IMember> criteria) {
+ return this.filter(criteria, true).head.map(head -> head.getValue());
+ }
+
+ private long size(Predicate<IMember> criteria) {
+ return this.filter(criteria, false).size;
+ }
+
+ public void reverse() {
+ this.reversed = !this.reversed;
+ }
+
+ @Override
+ public IMember search(long key) {
+ return this.search(member -> member.getKey() == key).orElse(null);
+ }
+
+ @Override
+ public IMember search(String name, String firstName) {
+ return this.search(member -> member.getName().equals(name)
+ && member.getFirstName().equals(firstName)).orElse(null);
+ }
+
+ @Override
+ public int size(KindOfSport kindOfSport) {
+ return (int) this.size(member -> member.getKindOfSport().equals(kindOfSport));
+ }
+
+ @Override
+ public IMember[] discipline(KindOfSport kindOfSport) {
+ return this.filter(member -> member.getKindOfSport().equals(kindOfSport), false)
+ .toArray();
+ }
+
+ @Override
+ public IMember[] toArray() {
+ IMember[] array = new IMember[this.size];
+ if (!this.head.isPresent()) {
+ return array;
+ }
+
+ LinkedListNode<IMember> currentNode = this.head.get();
+
+ for (int index = 0; index < this.size; index++) {
+ if (reversed) {
+ array[this.size - index - 1] = currentNode.getValue();
+ } else {
+ array[index] = currentNode.getValue();
+ }
+ currentNode = currentNode.getNext();
+ }
+
+ return array;
+ }
+
+ @Override
+ public int numberOfOperations() {
+ int numberOfOperations = this.numberOfOperations;
+ this.numberOfOperations = 0;
+ return numberOfOperations;
+ }
+}