diff --git a/Task_A/src/Enumerable.java b/Task_A/src/Enumerable.java index 177bce922b7d0268b8951c08ba5690c36647aeb1..98e26df7b54b4471cb3bdc89d8daed29aa9870e4 100644 --- a/Task_A/src/Enumerable.java +++ b/Task_A/src/Enumerable.java @@ -1,43 +1,36 @@ - - import java.util.Collection; +import java.util.ArrayList; +import java.util.List; import java.util.Iterator; public class Enumerable<T> implements Iterable<T> { - private Iterator<T> iterator; + private List<IPredicate<T>> predicates; + private Collection<T> collection; public Enumerable(Collection<T> collection) { - this.iterator = collection.iterator(); - } - - Enumerable<T> where(IPredicate<T> predicate) { - Iterator<T> oldIterator = iterator; - this.iterator = new Iterator<T>() { - - @Override - public boolean hasNext() { - return oldIterator.hasNext(); - } - - @Override - public T next() { - T item = oldIterator.hasNext() ? oldIterator.next() : null; - while (oldIterator.hasNext() && !predicate.accept(item)) { - item = oldIterator.next(); - } - return item; - } - }; - return this; + this.collection = collection; + this.predicates = new ArrayList<IPredicate<T>>(); + } + + public Enumerable(Collection<T> collection, List<IPredicate<T>> predicates) { + this.collection = collection; + this.predicates = predicates; + } + + public Enumerable<T> where(IPredicate<T> predicate) { + List<IPredicate<T>> newPredicates = new ArrayList<IPredicate<T>>(predicates); + newPredicates.add(predicate); + return new Enumerable<T>(collection, newPredicates); } @Override public Iterator<T> iterator() { - return iterator; + return new EnumerableIterator<T>(collection, predicates); } - void forEach(IAction<T> action) { + public void forEach(IAction<T> action) { + Iterator<T> iterator = iterator(); while (iterator.hasNext()) { T t = (T) iterator.next(); action.perform(t); @@ -45,3 +38,4 @@ public class Enumerable<T> implements Iterable<T> { } } + diff --git a/Task_A/src/EnumerableIterator.java b/Task_A/src/EnumerableIterator.java new file mode 100644 index 0000000000000000000000000000000000000000..a15e000113fc641548b134e147c7180ac7d3a8dd --- /dev/null +++ b/Task_A/src/EnumerableIterator.java @@ -0,0 +1,46 @@ +import java.util.List; +import java.util.Iterator; +import java.util.Collection; + +public class EnumerableIterator<T> implements Iterator<T> { + + private Iterator<T> collectionIterator; + public T peaked; + private List<IPredicate<T>> predicates; + + public EnumerableIterator(Collection<T> collection, List<IPredicate<T>> predicates) { + this.collectionIterator = collection.iterator(); + this.predicates = predicates; + } + + @Override + public boolean hasNext() { + if (peaked == null && collectionIterator.hasNext()) { // peaked is null if not checked + while (collectionIterator.hasNext()) { + peaked = collectionIterator.next(); + if (accept(peaked)) + return true; + } + peaked = null; + } + return peaked != null; + } + + @Override + public T next() { + T next = null; + if (hasNext()) { + next = peaked; + peaked = null; + } + return next; + } + + private boolean accept(T t) { + for (IPredicate<T> p : predicates) { + if (!p.accept(t)) + return false; + } + return true; + } +} diff --git a/Task_A/src/Test.java b/Task_A/src/Test.java index 6f38516f1926177e588d87787c017f779da399c3..965a39cf2f8710b938dca96f821832aae6ac6cec 100644 --- a/Task_A/src/Test.java +++ b/Task_A/src/Test.java @@ -1,5 +1,3 @@ - - import java.text.MessageFormat; import java.util.ArrayList; @@ -13,7 +11,26 @@ public class Test { arrayList.add(7); Enumerable<Integer> enumerable = new Enumerable<>(arrayList); - Enumerable<Integer> evenNumbers = enumerable + Enumerable<Integer> enumerablePrimes = enumerable + + .where(new IPredicate<Integer>() { + + @Override + public boolean accept(Integer element) { + if (element <= 3) + return element > 1; + else if (element % 2 == 0 || element % 3 == 0) + return false; + int i = 5; + while (i * i <= element) { + if (element % i == 0 || element % (i + 2) == 0) + return false; + i = i + 6; + } + return true; + } + }); + Enumerable<Integer> evenNumbers = enumerablePrimes .where(new IPredicate<Integer>() { @Override @@ -22,7 +39,7 @@ public class Test { } }); - Enumerable<Integer> oddNumbers = enumerable + Enumerable<Integer> oddNumbers = enumerablePrimes .where(new IPredicate<Integer>() { @Override @@ -43,7 +60,7 @@ public class Test { @Override public void perform(Integer t) { - System.out.println(MessageFormat.format("Odd number{0}", t)); + System.out.println(MessageFormat.format("Odd number {0}", t)); } }); }