【问题标题】:Comparison of Integer with nil failed in bubble sort algorithm冒泡排序算法中整数与 nil 的比较失败
【发布时间】:2019-04-28 04:16:05
【问题描述】:

我正在创建一个冒泡排序算法。为什么我得到Integer与nil的错误信息比较失败(ArgumentError)?

def bubble_sort(arr)

  arr.each_with_index do |i, j|    
    print arr[j]
    print arr[j+1]

    if arr[j] > arr[j+1]
      print "swap"
    end 
  end

  print arr

end

bubble_sort([4,3,78,2,0,2])

【问题讨论】:

  • 当您到达arr、j = arr.size-1 和i = arr[j] 的最后一个元素时。然后将arr[j] 与arr[j+1] 进行比较。因此后者等于nil,因此您将整数与nil 进行比较。 (推测,arr 包含整数。)
  • 即使你解决了你的问题,你的算法也不会工作,因为你实际上并没有交换arr的元素。使用puts "swap",您只是在说您是。 :-)

标签: ruby comparison argument-error


【解决方案1】:

首先,当最后一个索引可能是j 时,您要求脚本读取J+1 索引。或者换句话说,您要求访问数组中的 nil 值。您必须确保不要尝试访问数组中的 n+1 元素。 如果到达最后一个元素,只需检查并从循环中中断:

break if arr.size-1 == j #j is the last index now 

其次,您没有在代码中执行任何操作,而是在打印。你可以做点什么

temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp

【讨论】:

  • 谢谢,现在可以了。该脚本更多的是练习。现在我可以用它做点什么了:-)
  • 回想一下,使用 并行赋值(又名 多重赋值)您不需要变量 (temp)。只需arr[j], arr[j+1] = arr[j+1], arr[j]。说“您要求访问数组中的 nil 值”是不准确的。毕竟,数组可能包含nil 元素。我相信你的意思是 OP 试图索引一个索引大于数组最后一个元素的索引(arr.size-1)的元素,所以返回nil。是的,有点罗嗦,但生活就是这样。最后,我认为您不会在循环中使用break;你永远不会有一个越界索引。
  • 感谢@CarySwoveland。关于您的第二点,您是在谈论这样的事情吗? arr.each_with_index do |element, index|; if arr.size-1 != index; arr[index], arr[index+1] = arr[index+1], arr[index]; end; end
【解决方案2】:

当您使用.each_with_index 迭代数组时,找不到索引为j+1 的数组元素。 j+1 返回 nil,然后您尝试将其与导致 Argument 错误的 arr[j] 进行比较。

.each_with_index 在这里没有用,因为您只使用索引。如果发现未排序的值,您需要再次运行检查。

我的建议是使用从 0 到最后一个可能的索引值的循环。像这样的:

def bubble_sort(arr)
  index = 0

  while index < arr.size - 1 do
    if arr[index] > arr[index+1]
      arr[index], arr[index+1] = arr[index+1], arr[index]
      index = 0
    else
      index += 1
    end
  end

  print arr
end

bubble_sort([4,3,78,2,0,2]) # => [0, 2, 2, 3, 4, 78]

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 2015-02-03
    • 1970-01-01
    • 2016-02-06
    • 2023-03-20
    • 2013-06-20
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多