【发布时间】:2021-11-17 10:48:32
【问题描述】:
这是一个数组的sort 函数 - elements。我们在elements 的右边添加一个项目后,我们在它上面调用sort。
sort() {
var index = elements.size - 2
while (index >= 0 &&
elements[index + 1].compareTo(elements[index]) > 0) {
swap(index, index + 1)
index--;
}
}
假设我有这个数组:val array = ArrayList()。现在我在这个array 上加1,每次我添加一个项目时,我都会在array 上运行sort。显然,我们有:
index = -1
elements[1].compareTo(elements[-1])
代码编译并正确运行。我认为最大的索引 == elements.size - 1 和第二大的 == elements.size - 2,所以我修改了这样的代码:
sort() {
var index = count
while (index >= 0 &&
elements[index - 1].compareTo(elements[index - 2]) > 0) {
swap(index-1, index - 2)
index--;
}
这是错误:“索引 -1 超出长度 1 的范围”
我的问题:
-
var index = elements.size - 2有什么意义,带走2。 - 第二段代码出现越界错误,而不是原始代码,尽管两者都访问数组元素越界。
更新:这是我自己的修改,所以不知道是否反映了作者的意图。
sort(elements: ArrayList<Int>) {
fun swap(i: Int, j: Int) {
val tmp = elements[i]
elements[i] = elements[j]
elements[j] = tmp
}
var index = elements.size - 2
while (index >= 0 &&
elements[index + 1].compareTo(elements[index]) > 0) {
swap(index, index + 1)
index--;
}
}
【问题讨论】:
-
请显示minimal reproducible example。您发布的代码甚至无法编译。这里缺少很多东西。
-
您的问题应该是独立的。我不需要访问外部站点即可查看您的minimal reproducible example。
-
它是所有这些文件的一部分。无论如何,我已经弄清楚了为什么 index = count - 2。我只是不知道为什么不允许越界索引,但它们在运行时是允许的。