【问题标题】:Ruby, bubble_sort_by(arr), code is working but returning original arrayRuby,bubble_sort_by(arr),代码正在运行但返回原始数组
【发布时间】:2017-06-08 23:01:41
【问题描述】:

小问题:
为什么我的方法(接受块)返回原始数组而不是修改。

长问题:
像这样的代码:

def bubble_sort_by(array)
  array.each_with_index do |outer, outer_index|
    array.each_with_index do |inner, inner_index|
      if yield(outer, inner) > 0
        if outer_index < inner_index
              p "outer after if: " + outer        # for debugging, indented for clarity
              p "inner after if: " + inner        # for debugging
          outer, inner = inner, outer
              p "outer after swap: " + outer      # for debugging
              p "inner after swap: " + inner      # for debugging
        end
      end
    end
  end
end

bubble_sort_by(["hi","hello","hey"]) do |left,right|
  left.length - right.length
end

在 irb 中我看到 outerinner 的值被交换(排序),但返回值仍然是原始数组。

2.3.3 :1223 >     end
"outer after if: hello"
"inner after if: hey"
"outer after swap: hey"
"inner after swap: hello"
 => ["hi", "hello", "hey"] 
2.3.3 :1224 > 

我之前用非常相似的代码编写了类似的方法bubble_sort(没有块),并且原始数组被替换为那里的交换值。
我不明白为什么交换的值没有保存在此处提到的方法中,而是收到原始数组。

【问题讨论】:

    标签: arrays ruby loops yield bubble-sort


    【解决方案1】:

    你只是在交换局部变量

    outer, inner = inner, outer
    

    这不会修改array,要更改数组必须使用[]=

    array[n] = value
    

    【讨论】:

      【解决方案2】:

      您需要更改数组项的值。这是工作代码:

      def bubble_sort_by(array)
        array.each_with_index do |outer, outer_index|
          array.each_with_index do |inner, inner_index|
            if yield(outer, inner) > 0
              if outer_index < inner_index
                    p "outer after if: " + outer        # for debugging, indented for clarity
                    p "inner after if: " + inner        # for debugging
                outer, inner = inner, outer
                    p "outer after swap: " + outer      # for debugging
                    p "inner after swap: " + inner      # for debugging
      
                # change value array item
                array[inner_index] = inner
                array[outer_index] = outer
              end
            end
          end
        end
      end
      

      【讨论】:

      • 这个答案也解决了我的下一个问题,没有对最大元素在第一位(或最短在最后一位)的数组进行排序。仅替换此:outer, inner = inner, outer 与此:array[outer_index], array[inner_index] = array[inner_index], array[outer_index] 不会在“最坏情况”中对数组进行排序。我需要更深入地分析不时发生的事情。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2013-07-19
      • 1970-01-01
      相关资源
      最近更新 更多