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> 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 newHead = new LinkedListNode(value); if (this.head.isPresent()) { newHead.setNext(this.head.get()); } this.head = Optional.of(newHead); this.size++; return true; // TODO? } private Management filter(Predicate 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 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 search(Predicate criteria) { return this.filter(criteria, true).head.map(head -> head.getValue()); } private long size(Predicate 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 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; } }