public
class
CircularIterator<T> {
private
int
currentPosition =
0
;
private
final
List<T> items;
public
CircularIterator(List<T> items) {
this
.items = items;
}
private
int
lastIndex() {
return
items.size() -
1
;
}
public
T currentItem() {
return
items.get(currentPosition);
}
public
boolean
hasNext() {
return
currentPosition < lastIndex();
}
public
T next() {
if
(hasNext()) {
currentPosition++;
return
currentItem();
}
currentPosition =
0
;
return
currentItem();
}
public
boolean
hasPrevious() {
return
currentPosition >
0
;
}
public
T previous() {
if
(hasPrevious()) {
currentPosition--;
return
currentItem();
}
currentPosition = lastIndex();
return
currentItem();
}
public
int
nextIndex() {
return
currentPosition +
1
;
}
public
int
previousIndex() {
return
currentPosition -
1
;
}
}
public
class
CircularIteratorTest {
final
CircularIterator it =
new
CircularIterator(Arrays.asList(
"text1"
,
"text2"
,
"text3"
,
"text4"
,
"text5"
));
@Test
public
void
testIterator() {
assertEquals(
"text1"
, it.currentItem());
assertEquals(
"text2"
, it.next());
assertEquals(
"text3"
, it.next());
assertEquals(
"text4"
, it.next());
assertEquals(
"text5"
, it.next());
assertEquals(
"text1"
, it.next());
assertEquals(
"text2"
, it.next());
assertEquals(
"text2"
, it.currentItem());
assertEquals(
"text1"
, it.previous());
assertEquals(
"text1"
, it.currentItem());
assertEquals(
"text5"
, it.previous());
assertEquals(
"text4"
, it.previous());
assertEquals(
"text3"
, it.previous());
assertEquals(
"text2"
, it.previous());
}
}