如何使用 Kotlin 为 LinkedList 实现迭代器
How to implement iterator for a LinkedList using Kotlin
我正在 Kotlin 中实现 LinkedList。我想实现 Iterator
接口,这样我就可以像这样 linkedlist.forEach{}
.
这是我的代码
class SinglyLinkedList<T> : Iterator<T> {
var head: SinglyLinkedListNode<T>? = null
private set(value) {
cursor = value
field = value
}
var count = 0
private set
// This is needed for iterator functionality.
private var cursor: SinglyLinkedListNode<T>? = null
override fun hasNext(): Boolean {
// the problem is when I return in the middle of the loop
// then start new for each
// cursor is not equal head
return if (cursor == null){
// if this is the last time, reset cursor so that next time we start from the begining
cursor = head
false
} else {
true
}
}
override fun next(): T {
val temp = cursor
cursor = cursor!!.next
return temp!!.value
}
}
当我这样做时会出现问题
linkedlist.forEach{
if(it) == 1 return
}
然后我再次尝试 forEach
,它将从它停止的最后一个元素继续。
then I try to forEach
again, it will continue from the last element it stopped at.
是的,这就是 Iterator
应该做的。 Iterator
是一个有状态的东西——它知道它当前在哪个元素上。你想让你的链表知道它当前“在”哪个元素吗?你可能不知道,是吗?您希望您的链表和该链表的 迭代器 是不同的东西。
列表可以是iterable,意思是可以从列表中得到一个iterator
class SinglyLinkedList<T> : Iterable<T> {
var head: SinglyLinkedListNode<T>? = null
private set
var count = 0
private set
override fun iterator() = object: Iterator<T> {
private var cursor: SinglyLinkedListNode<T>? = head
override fun hasNext() = cursor != null
override fun next() = (cursor?.value ?: throw NoSuchElementException()).also {
cursor = cursor?.next
}
}
}
现在在列表上做forEach
会创建一个列表的迭代器,在遍历列表后(无论迭代到哪个元素),迭代器将被丢弃。下次调用 forEach
时,会创建一个全新的迭代器。
我正在 Kotlin 中实现 LinkedList。我想实现 Iterator
接口,这样我就可以像这样 linkedlist.forEach{}
.
这是我的代码
class SinglyLinkedList<T> : Iterator<T> {
var head: SinglyLinkedListNode<T>? = null
private set(value) {
cursor = value
field = value
}
var count = 0
private set
// This is needed for iterator functionality.
private var cursor: SinglyLinkedListNode<T>? = null
override fun hasNext(): Boolean {
// the problem is when I return in the middle of the loop
// then start new for each
// cursor is not equal head
return if (cursor == null){
// if this is the last time, reset cursor so that next time we start from the begining
cursor = head
false
} else {
true
}
}
override fun next(): T {
val temp = cursor
cursor = cursor!!.next
return temp!!.value
}
}
当我这样做时会出现问题
linkedlist.forEach{
if(it) == 1 return
}
然后我再次尝试 forEach
,它将从它停止的最后一个元素继续。
then I try to
forEach
again, it will continue from the last element it stopped at.
是的,这就是 Iterator
应该做的。 Iterator
是一个有状态的东西——它知道它当前在哪个元素上。你想让你的链表知道它当前“在”哪个元素吗?你可能不知道,是吗?您希望您的链表和该链表的 迭代器 是不同的东西。
列表可以是iterable,意思是可以从列表中得到一个iterator
class SinglyLinkedList<T> : Iterable<T> {
var head: SinglyLinkedListNode<T>? = null
private set
var count = 0
private set
override fun iterator() = object: Iterator<T> {
private var cursor: SinglyLinkedListNode<T>? = head
override fun hasNext() = cursor != null
override fun next() = (cursor?.value ?: throw NoSuchElementException()).also {
cursor = cursor?.next
}
}
}
现在在列表上做forEach
会创建一个列表的迭代器,在遍历列表后(无论迭代到哪个元素),迭代器将被丢弃。下次调用 forEach
时,会创建一个全新的迭代器。