Skip to content
Snippets Groups Projects
Commit 629bd1f1 authored by gusan092's avatar gusan092
Browse files

Added solution and a better test

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.ArrayList;
import java.util.List;
import java.util.Iterator; import java.util.Iterator;
public class Enumerable<T> implements Iterable<T> { 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) { public Enumerable(Collection<T> collection) {
this.iterator = collection.iterator(); this.collection = collection;
} this.predicates = new ArrayList<IPredicate<T>>();
}
Enumerable<T> where(IPredicate<T> predicate) {
Iterator<T> oldIterator = iterator; public Enumerable(Collection<T> collection, List<IPredicate<T>> predicates) {
this.iterator = new Iterator<T>() { this.collection = collection;
this.predicates = predicates;
@Override }
public boolean hasNext() {
return oldIterator.hasNext(); public Enumerable<T> where(IPredicate<T> predicate) {
} List<IPredicate<T>> newPredicates = new ArrayList<IPredicate<T>>(predicates);
newPredicates.add(predicate);
@Override return new Enumerable<T>(collection, newPredicates);
public T next() {
T item = oldIterator.hasNext() ? oldIterator.next() : null;
while (oldIterator.hasNext() && !predicate.accept(item)) {
item = oldIterator.next();
}
return item;
}
};
return this;
} }
@Override @Override
public Iterator<T> iterator() { 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()) { while (iterator.hasNext()) {
T t = (T) iterator.next(); T t = (T) iterator.next();
action.perform(t); action.perform(t);
...@@ -45,3 +38,4 @@ public class Enumerable<T> implements Iterable<T> { ...@@ -45,3 +38,4 @@ public class Enumerable<T> implements Iterable<T> {
} }
} }
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;
}
}
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -13,7 +11,26 @@ public class Test { ...@@ -13,7 +11,26 @@ public class Test {
arrayList.add(7); arrayList.add(7);
Enumerable<Integer> enumerable = new Enumerable<>(arrayList); 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>() { .where(new IPredicate<Integer>() {
@Override @Override
...@@ -22,7 +39,7 @@ public class Test { ...@@ -22,7 +39,7 @@ public class Test {
} }
}); });
Enumerable<Integer> oddNumbers = enumerable Enumerable<Integer> oddNumbers = enumerablePrimes
.where(new IPredicate<Integer>() { .where(new IPredicate<Integer>() {
@Override @Override
...@@ -43,7 +60,7 @@ public class Test { ...@@ -43,7 +60,7 @@ public class Test {
@Override @Override
public void perform(Integer t) { public void perform(Integer t) {
System.out.println(MessageFormat.format("Odd number{0}", t)); System.out.println(MessageFormat.format("Odd number {0}", t));
} }
}); });
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment