【问题标题】:Ruby "ArgumentError: comparison of Fixnum with Array failed"Ruby“ArgumentError:Fixnum 与数组的比较失败”
【发布时间】:2014-08-29 10:14:39
【问题描述】:

我正在尝试实现一个 Ruby 合并排序算法,在我看来,该程序应该可以工作。但是,我收到标题中列出的错误,我不太清楚为什么。任何帮助将不胜感激

完整代码:

def merge_sort(arr)
    return arr if arr.length == 1
    mid = arr.length/2
    left = merge_sort(arr[0..mid-1])
    right = merge_sort(arr[mid..-1])
    merge(left,right)
end

def merge(arr1,arr2,merged=[])

    i=0 #arr1 initialize
    j=0 #arr2 initialize
    while i < arr1.length || j < arr2.length
        if i < arr1.length && j<arr2.length
            if arr1[i] <= arr2[j]
                merged << arr1[i]
                i+=1
            else
                merged << arr2[j]
                j+=1
            end
        elsif i<arr1.length
            merged << arr1[i..-1]
            i=arr1.length
        elsif j<arr2.length
            merged << arr2[j..-1]
            j=arr2.length
        end
    end
    merged
end


array = [10,9,8,7,6,5,4,3,2,1]
p merge_sort(array)

错误

$ ruby mergeSort.rb 
mergeSort.rb:15:in `<=': comparison of Fixnum with Array failed (ArgumentError)
    from mergeSort.rb:15:in `merge'
    from mergeSort.rb:6:in `merge_sort'
    from mergeSort.rb:5:in `merge_sort'
    from mergeSort.rb:4:in `merge_sort'
    from mergeSort.rb:36:in `<main>'

注意:这里是第 15 行

如果 arr1[i]

【问题讨论】:

  • 未来值得指出的是,鉴于 X 行出现错误,您应该从在 X-1 行打印变量开始。例如,在第 15 行之前添加p arr1p arr2。这会在错误之前向您显示[8][6, [7]],这样会更有意义。 永远不要低估在调试期间打印变量的能力。 :-)
  • tt,当我读到“……在我看来,该程序应该可以工作”时,我笑了。我相信这里的每个人都熟悉这种技术。
  • @DreadPirateShawn 这是一个很好的建议。从现在开始,我肯定会合并它。谢谢!

标签: ruby recursion mergesort


【解决方案1】:

问题是您通过调用&lt;&lt; in 将数组推入数组

elsif i<arr1.length
  merged << arr1[i..-1]
  i=arr1.length
elsif j<arr2.length
  merged << arr2[j..-1]
  j=arr2.length
end

这会创建不需要的嵌套数组。当您通过arr1[i] &lt;= arr2[j] 比较数组元素时,arr1arr2 的元素不一定在同一嵌套级别(即,它们可能是数组,也可能不是数组)。这会导致错误。

如果把上面部分的&lt;&lt;改成concat,就可以了。

【讨论】:

  • 完美解决方案。我根本没有考虑过……奇怪的是它在第 15 行报告了错误,而不是低于实际错误的位置。谢谢!
  • 不,第 15 行确实出现了错误。创建嵌套数组没有任何问题(尽管这不是您想要的)。问题是你试图比较这样的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2010-12-26
  • 2015-01-15
  • 2021-12-08
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多