Skip to content

Commit 0bf438c

Browse files
authored
Merge pull request #42 from CloudCoders/iterator
Iterator
2 parents d4201cd + 37a1fe3 commit 0bf438c

7 files changed

Lines changed: 190 additions & 0 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package oop.Iterator
2+
3+
class BackwardsIterator<T>(list: MutableList<T>): NormalIterator<T>(list) {
4+
override fun first(): T? {
5+
index = list.size - 1
6+
return get()
7+
}
8+
9+
override fun hasNext(): Boolean = index - 1 > -1
10+
11+
override fun hasPrev(): Boolean = this.list.size > index + 1
12+
13+
override fun nextIndex(): Int = if(index > -1) index - 1 else -1
14+
15+
override fun prevIndex(): Int = if(index > this.list.size) index +1 else -1
16+
17+
override fun next(): T? = if (hasNext()) list[index--] else throw NoSuchElementException()
18+
19+
override fun prev(): T? = if (hasPrev()) list[index++] else throw NoSuchElementException()
20+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package oop.Iterator
2+
3+
interface Iterable<T> {
4+
fun getNormalIterator(): Iterator<T>
5+
fun getBackwardsIterator(): Iterator<T>
6+
}
7+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package oop.Iterator
2+
3+
interface Iterator<T> {
4+
fun first(): T?
5+
fun next(): T?
6+
fun prev(): T?
7+
fun hasNext():Boolean
8+
fun hasPrev(): Boolean
9+
fun nextIndex(): Int
10+
fun prevIndex(): Int
11+
fun set(element: T)
12+
fun get() : T
13+
fun <B> map(res: (T) -> B): MutableList<B>
14+
fun forEach(res: (T) -> Unit)
15+
fun filter(res: (T) -> Boolean): MutableList<T>
16+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package oop.Iterator
2+
3+
open class NormalIterator<T>(val list: MutableList<T>) : Iterator<T> {
4+
protected var index = 0
5+
6+
override fun first(): T? {
7+
index = 0
8+
return get()
9+
}
10+
11+
override fun hasNext(): Boolean = this.list.size > index + 1
12+
13+
override fun hasPrev(): Boolean = index - 1 > -1
14+
15+
override fun nextIndex(): Int = if (index > this.list.size) index + 1 else -1
16+
17+
override fun prevIndex(): Int = if (index > -1) index - 1 else -1
18+
19+
override fun next(): T? = if (hasNext()) list[index++] else throw NoSuchElementException()
20+
21+
override fun prev(): T? = if (hasPrev()) list[index--] else throw NoSuchElementException()
22+
23+
override fun set(element: T) {
24+
list[index] = element
25+
}
26+
27+
override fun get() = list[index]
28+
29+
override fun <B> map(res: (T) -> B): MutableList<B> {
30+
val res = ArrayList<B>(list.size)
31+
first()
32+
while (hasNext()) res.add(res(next()!!))
33+
res.add(res(get()))
34+
first()
35+
return res
36+
}
37+
38+
override fun forEach(res: (T) -> Unit) {
39+
first()
40+
while (hasNext()) {
41+
res(next()!!)
42+
}
43+
res(get()!!)
44+
45+
}
46+
47+
override fun filter(res: (T) -> Boolean): MutableList<T> {
48+
val res = ArrayList<T>()
49+
first()
50+
51+
while (hasNext()) {
52+
53+
if (res((get()!!))) res.add(next()!!)
54+
else next()
55+
}
56+
return res
57+
}
58+
59+
60+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package oop.Iterator
2+
3+
enum class TypeIterator {
4+
NORMAL, BACKWARDS, RANDOM
5+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package oop.Iterator
2+
3+
4+
import org.hamcrest.CoreMatchers.`is`
5+
import org.hamcrest.MatcherAssert.assertThat
6+
import org.junit.Test
7+
8+
class BackwardsIteratorShould {
9+
private val list = mutableListOf("10", "12", "15", "29", "30", "36")
10+
private val iterator: Iterator<String> = BackwardsIterator(list)
11+
12+
@Test
13+
fun `Return last item of collection when call`(){
14+
assertThat(iterator.first(),`is`("36"))
15+
}
16+
17+
@Test
18+
fun `Iterate list from back to start`(){
19+
var res = ""
20+
iterator.first()
21+
iterator.forEach {
22+
res += "$it,"
23+
}
24+
assertThat(res, `is`("36,30,29,15,12,10,"))
25+
}
26+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package oop.Iterator
2+
3+
import org.hamcrest.CoreMatchers.`is`
4+
import org.hamcrest.MatcherAssert.assertThat
5+
import org.junit.Test
6+
7+
class IteratorShould {
8+
private val list = mutableListOf("10", "12", "15", "29", "30", "36")
9+
private val iterator: Iterator<String> = NormalIterator(list)
10+
11+
@Test
12+
fun `Return first element with first`() {
13+
assertThat(iterator.first(), `is`("10"))
14+
}
15+
16+
@Test
17+
fun `Return fourth element doing first-next-next-next`() {
18+
iterator.first()
19+
iterator.next()
20+
iterator.next()
21+
iterator.next()
22+
assertThat(iterator.get(), `is`("29"))
23+
}
24+
25+
@Test(expected = NoSuchElementException::class)
26+
fun `Throw NoSuchElementException if element don't have next `() {
27+
iterator.first()
28+
(1..7).forEach { iterator.next() }
29+
}
30+
31+
@Test
32+
fun `Return -1 when ask to prev index in first element`() {
33+
iterator.first()
34+
assertThat(iterator.prevIndex(), `is`(-1))
35+
}
36+
37+
38+
@Test
39+
fun `Transform all elements of a list when using map`() {
40+
val transformList = iterator.map { it.toInt() }
41+
assertThat(transformList, `is`(listOf(10, 12, 15, 29, 30, 36)))
42+
}
43+
44+
@Test
45+
fun `Filter list with criterion using filter`() {
46+
val filterList = iterator.filter { it.contains("1") }
47+
assertThat(filterList, `is`(listOf("10", "12", "15")))
48+
}
49+
50+
@Test
51+
fun `Apply function to all elements`() {
52+
var res = 0
53+
iterator.forEach { res += it.toInt() }
54+
assertThat(res, `is`(132))
55+
}
56+
}

0 commit comments

Comments
 (0)