Skip to content
Snippets Groups Projects
Commit 98c7d5aa authored by Jarrett Shan Wei Yeo's avatar Jarrett Shan Wei Yeo
Browse files

Update Enumerable.java

parent 1fafabff
No related branches found
No related tags found
No related merge requests found
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
public class Enumerable<T> implements Iterable<T> { public class Enumerable<T> implements Iterable<T> {
// Define variables
private Enumerable<T> newEnumerable;
private Iterator<T> iterator; private Iterator<T> iterator;
private Collection<T> newCollection;
// Use collection for iteration operations
public Enumerable(Collection<T> collection) { public Enumerable(Collection<T> collection) {
this.iterator = collection.iterator(); this.iterator = collection.iterator();
this.newCollection = collection;
} }
// Redefined where() method
Enumerable<T> where(IPredicate<T> predicate) { Enumerable<T> where(IPredicate<T> predicate) {
Iterator<T> oldIterator = iterator;
this.iterator = new Iterator<T>() { // Need to create a new Enumerable, or else the same reference will be used
// and you can only iterate through a given list once
newEnumerable = new Enumerable<T>(newCollection);
newEnumerable.iterator = new Iterator<T>() {
Iterator<T> oldIterator = newEnumerable.iterator;
@Override @Override
public boolean hasNext() { public boolean hasNext() { return oldIterator.hasNext(); };
return oldIterator.hasNext();
}
@Override @Override
public T next() { public T next() {
T item = oldIterator.hasNext() ? oldIterator.next() : null;
while (oldIterator.hasNext() && !predicate.accept(item)) { // define element as T
item = oldIterator.next(); T element;
// if iterator has more items, we get it, else return null
if(oldIterator.hasNext()) {
element = oldIterator.next();
} else {
element = null;
} }
return item;
while (oldIterator.hasNext() && !predicate.accept(element)) element = oldIterator.next();
// handle last element
if( !(oldIterator.hasNext() || predicate.accept(element)) ) element = null;
return element;
} }
}; };
return this;
// cannot use or return this, else the same list cannot be reused after 1 full iteration
return newEnumerable;
} }
@Override @Override
public Iterator<T> iterator() { public Iterator<T> iterator() {
return iterator; return iterator;
...@@ -39,9 +70,14 @@ public class Enumerable<T> implements Iterable<T> { ...@@ -39,9 +70,14 @@ public class Enumerable<T> implements Iterable<T> {
void forEach(IAction<T> action) { void forEach(IAction<T> action) {
while (iterator.hasNext()) { while (iterator.hasNext()) {
T t = (T) iterator.next();
action.perform(t); // get next element
T nextItem = (T) iterator.next();
// ignore last (null) element
if (nextItem != null) action.perform(nextItem);
} }
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment