【问题标题】:Why doesn't this kotlin code throw out-of-bounds errors? [closed]为什么这个 kotlin 代码不会抛出越界错误? [关闭]
【发布时间】: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 的范围”

我的问题:

  1. var index = elements.size - 2有什么意义,带走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--;
        }
      }

  

【问题讨论】:

标签: arrays algorithm kotlin


【解决方案1】:

你显然错过了这张支票:

while (index &gt;= 0

不,原始代码没有超出范围,因为它没有执行 index = -1 循环内的代码。您的代码确实如此,然后它超出了界限。我没有验证这一点,但我想如果你会修改这个检查以及其他地方,所以它会是:while (index &gt;= 2 那么你的代码就可以了。

减去 2 的原因只是为了从倒数第二个元素开始排序。本质上,它会忽略空数组和单项数组。

此外,它看起来并不像一个完全有效的排序算法。它看起来像冒泡排序,但您需要在另一个循环中多次运行此代码。

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多