我正在嘗試“手動”構建一個鏈接串列,但我不斷收到例外。
Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.example.interview.Node.toString()
我不想使用 kotlin 的預構建鏈表。這是一個練習,所以我需要手動構建所有內容。為什么我必須重寫 toString()?即使我這樣做,它也會以同樣的方式崩潰。
代碼:
data class Node(
var value: Int,
var next: Node? = null,
var prev: Node? = null
) {
}
fun makeLinkedList() {
val root = Node(1)
val node1 = Node(2)
val node2 = Node(3)
val node3 = Node(4)
root.next = node1
node1.prev = root
node1.next = node2
node2.prev = node1
node2.next = node3
node3.prev = node2
var it = root
do {
println(it.toString())
it = it.next!!
} while (it != null)
}
我調查了這個執行緒,但它甚至不是 Kotlin。沒有太大幫助:
Spring JPA 雙向無法評估 toString
uj5u.com熱心網友回復:
data class自動提供toString()列印所有屬性的實作。這種實作在這種特定情況下不是很有用,因為雙向鏈表自然包含節點之間的回圈參考,因此toString()無限回圈地迭代回圈中的節點。要列印第一個節點,它會嘗試列印第二個節點,但要列印第二個節點,它會嘗試列印第一個節點。等等。資料類生成的其他函式也會遇到同樣的問題:hashCode()和equals().
我相信在這種情況下,您不會以任何方式從資料類中受益,因此您應該將其定義Node為常規類。或者,您可以從以特殊方式處理prev的屬性串列中洗掉:data class
data class Node(
var value: Int,
var next: Node? = null,
) {
var prev: Node? = null
}
這種方式仍然會提供丑陋的結果,因此您可以覆寫它,toString()但至少應該正確比較整個串列。hashCode()equals()
此外,通過查看如何列印每個節點以查看整個串列(而不僅僅是頭部),您似乎并沒有真正打算Node表示整個串列,而只是表示這個單個節點。在這種情況下,您可能更愿意next從資料屬性中洗掉或再次洗掉,根本不要使用data class。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523754.html
標籤:科特林双向链表
下一篇:當我添加rxjava和rxkotlin時,build.gradle.kts中出現意外的標記(使用';'分隔同一行上的運算式)
