diff options
Diffstat (limited to 'AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java')
| -rw-r--r-- | AlgoAufgabe1/src/de/ostfalia/algo/ws18/s1/Management.java | 152 |
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; + } +} |
