gpt4 book ai didi

java - 整数 n 作为 List.sublist(fromIndex, toIndex) 的第二个参数传递,但堆栈跟踪显示 Kotlin 中的 toIndex 是 n + 2

转载 作者:行者123 更新时间:2023-12-02 09:17:36 24 4
gpt4 key购买 nike

我正在解决 Codewars 中的问题:https://www.codewars.com/kata/56a5d994ac971f1ac500003e/train/kotlin输入是一个字符串数组和一个整数 k,输出是通过从数组中连续取出 k 个元素并将它们连接到字符串可以形成的最长字符串。下面是我解决这个问题的代码,我现在正在测试它。

fun main() {

val array = arrayOf("1", "2", "3", "4", "5", "6", "7")
println(longestConsec(array, 2))

// Combinations below don't work either
// val array = arrayOf("1", "2", "3", "4","5", "6", "7", "8", "9")
// println(longestConsec(array, 3))
//
// val array = arrayOf("1", "2", "3", "4","5", "6", "7", "8", "9", "10", "11")
// println(longestConsec(array, 4))

// val array = arrayOf("1", "2", "3", "4","5", "6", "7", "8", "9", "10", "11", "12", "13")
// println(longestConsec(array, 5))

}

fun longestConsec(strings: Array<String>, size: Int) =
when {
strings.isEmpty() || size > strings.size || size <= 0 -> ""
else -> ConsecutiveString(strings.toList(), size)
.searchLongestConsecutiveString(0, mutableListOf())
.maxBy { it.length } ?: throw IllegalArgumentException()
}

class ConsecutiveString(private val originalList: List<String>, private val size: Int) {

tailrec fun searchLongestConsecutiveString(index: Int, acc: MutableList<String>): List<String> {
println("start")
return when {
index + size >= originalList.size -> acc
else -> {
println(index + size)
// *** doesn't work ***
searchLongestConsecutiveString(
index + 1
, acc.apply { add(originalList.subList(index, index + size).joinToString("")) }
)
// *** doesn't work ***

// *** works ***
// val consecutiveString = originalList.subList(index, index + size).joinToString("")
// searchLongestConsecutiveString(
// index + 1
// , acc.apply { add(consecutiveString) }
// )
// *** works ***
}
}
}
}

此代码抛出 java.lang.IndexOutOfBoundsException,这是堆栈跟踪。

start

2

start

3

start

4

start

5

start

6

Exception in thread "main" java.lang.IndexOutOfBoundsException: toIndex = 8

at java.util.ArrayList.subListRangeCheck(ArrayList.java:1010)

at java.util.ArrayList.subList(ArrayList.java:1002)

at ConsecutiveString.searchLongestConsecutiveString(CodeWars.kt:37)

at CodeWarsKt.longestConsec(CodeWars.kt:22)

at CodeWarsKt.main(CodeWars.kt:4)

at CodeWarsKt.main(CodeWars.kt)

Process finished with exit code 1

这里有 3 件有趣的事情。

  1. index + size 作为 sublist(fromIndex, toIndex) 的第二个参数传递,似乎是抛出异常的行之前的 6。然而,堆栈跟踪显示 toIndex 是 8,而不是 6。
  2. 如果字符串数组的大小小于 N * 2 + 3(其中 N 是 longConsec(strings, size) 的第二个参数),此代码不会抛出 IndexOutOfBoundsException
  3. 如果事先准备好字符串 val 并将其添加到 acc 中(请参阅上面代码中的注释),而不是使用 apply() 并将结果递归地传递给方法,则不会引发异常

我尝试不使用 tailrec,但结果是相同的。

谁能帮我弄清楚这里发生了什么?

我的环境如下。

操作系统:Windows 10 家庭版

IntelliJ IDEA:2019.2(社区版)11.0.3+12-b304.10 amd64

Kotlin:1.3.41-release-150(JRE 1.8.0_151-b12)

IntelliJ Kotlin 插件:1.3.50-release-IJ2019.2-1

最佳答案

您在acc.apply内调用size。在该范围内,size 指的是 acc 的大小,而不是 ConsecutiveString::size
避免使用 apply 或使用标签:

this@ConsecutiveString.size

关于java - 整数 n 作为 List<String>.sublist(fromIndex, toIndex) 的第二个参数传递,但堆栈跟踪显示 Kotlin 中的 toIndex 是 n + 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58888353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com