diff --git a/iterator/pom.xml b/iterator/pom.xml
new file mode 100644
index 000000000..0df419ffb
--- /dev/null
+++ b/iterator/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ iterator
+ 1.0-SNAPSHOT
+ iterator
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/iterator/src/main/java/com/iluwatar/App.java b/iterator/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..b3ca3d491
--- /dev/null
+++ b/iterator/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,35 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ TreasureChest chest = new TreasureChest();
+
+ ItemIterator ringIterator = chest.Iterator(ItemType.RING);
+ while (ringIterator.hasNext()) {
+ System.out.println(ringIterator.next());
+ }
+
+ System.out.println("----------");
+
+ ItemIterator potionIterator = chest.Iterator(ItemType.POTION);
+ while (potionIterator.hasNext()) {
+ System.out.println(potionIterator.next());
+ }
+
+ System.out.println("----------");
+
+ ItemIterator weaponIterator = chest.Iterator(ItemType.WEAPON);
+ while (weaponIterator.hasNext()) {
+ System.out.println(weaponIterator.next());
+ }
+
+ System.out.println("----------");
+
+ ItemIterator it = chest.Iterator(ItemType.ANY);
+ while (it.hasNext()) {
+ System.out.println(it.next());
+ }
+ }
+}
diff --git a/iterator/src/main/java/com/iluwatar/Item.java b/iterator/src/main/java/com/iluwatar/Item.java
new file mode 100644
index 000000000..f7a3b7661
--- /dev/null
+++ b/iterator/src/main/java/com/iluwatar/Item.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+public class Item {
+
+ private ItemType type;
+ private String name;
+
+ public Item(ItemType type, String name) {
+ this.setType(type);
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public ItemType getType() {
+ return type;
+ }
+
+ public void setType(ItemType type) {
+ this.type = type;
+ }
+}
diff --git a/iterator/src/main/java/com/iluwatar/ItemIterator.java b/iterator/src/main/java/com/iluwatar/ItemIterator.java
new file mode 100644
index 000000000..6c05d6f5c
--- /dev/null
+++ b/iterator/src/main/java/com/iluwatar/ItemIterator.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public interface ItemIterator {
+
+ boolean hasNext();
+
+ Item next();
+}
diff --git a/iterator/src/main/java/com/iluwatar/ItemType.java b/iterator/src/main/java/com/iluwatar/ItemType.java
new file mode 100644
index 000000000..905179417
--- /dev/null
+++ b/iterator/src/main/java/com/iluwatar/ItemType.java
@@ -0,0 +1,10 @@
+package com.iluwatar;
+
+public enum ItemType {
+
+ ANY,
+ WEAPON,
+ RING,
+ POTION
+
+}
diff --git a/iterator/src/main/java/com/iluwatar/TreasureChest.java b/iterator/src/main/java/com/iluwatar/TreasureChest.java
new file mode 100644
index 000000000..a0d69aab6
--- /dev/null
+++ b/iterator/src/main/java/com/iluwatar/TreasureChest.java
@@ -0,0 +1,34 @@
+package com.iluwatar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TreasureChest {
+
+ private List- items;
+
+ public TreasureChest() {
+ items = new ArrayList<>();
+ items.add(new Item(ItemType.POTION, "Potion of courage"));
+ items.add(new Item(ItemType.RING, "Ring of shadows"));
+ items.add(new Item(ItemType.POTION, "Potion of wisdom"));
+ items.add(new Item(ItemType.POTION, "Potion of blood"));
+ items.add(new Item(ItemType.WEAPON, "Sword of silver +1"));
+ items.add(new Item(ItemType.POTION, "Potion of rust"));
+ items.add(new Item(ItemType.POTION, "Potion of healing"));
+ items.add(new Item(ItemType.RING, "Ring of armor"));
+ items.add(new Item(ItemType.WEAPON, "Steel halberd"));
+ items.add(new Item(ItemType.WEAPON, "Dagger of poison"));
+ }
+
+ ItemIterator Iterator(ItemType type) {
+ return new TreasureChestItemIterator(this, type);
+ }
+
+ public List
- getItems() {
+ ArrayList
- list = new ArrayList<>();
+ list.addAll(items);
+ return list;
+ }
+
+}
diff --git a/iterator/src/main/java/com/iluwatar/TreasureChestItemIterator.java b/iterator/src/main/java/com/iluwatar/TreasureChestItemIterator.java
new file mode 100644
index 000000000..01e089b08
--- /dev/null
+++ b/iterator/src/main/java/com/iluwatar/TreasureChestItemIterator.java
@@ -0,0 +1,48 @@
+package com.iluwatar;
+
+import java.util.List;
+
+public class TreasureChestItemIterator implements ItemIterator {
+
+ private TreasureChest chest;
+ private int idx;
+ private ItemType type;
+
+ public TreasureChestItemIterator(TreasureChest chest, ItemType type) {
+ this.chest = chest;
+ this.type = type;
+ this.idx = -1;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return findNextIdx() != -1;
+ }
+
+ @Override
+ public Item next() {
+ idx = findNextIdx();
+ if (idx != -1) {
+ return chest.getItems().get(idx);
+ }
+ return null;
+ }
+
+ private int findNextIdx() {
+
+ List
- items = chest.getItems();
+ boolean found = false;
+ int tempIdx = idx;
+ while (!found) {
+ tempIdx++;
+ if (tempIdx >= items.size()) {
+ tempIdx = -1;
+ break;
+ }
+ if (type.equals(ItemType.ANY) || items.get(tempIdx).getType().equals(type)) {
+ break;
+ }
+ }
+ return tempIdx;
+ }
+}
diff --git a/pom.xml b/pom.xml
index e08b5109f..3efe1bfa0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,7 @@
chain
command
interpreter
+ iterator