2017-01-24 56 views
0

簡短問題:
爲什麼我的方法(它接受塊)正在返回原始數組而不是修改。Ruby,bubble_sort_by(arr),代碼正在工作,但返回原始數組

長的問題:
這樣的代碼:

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(沒有塊)和原始陣列被交換的值替代那裏。
我不明白爲什麼交換的值沒有保存在這裏提到的方法中,而是我收到原始數組。

回答

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 
+0

這個答案也解決了我的下一個問題,沒有排序數組,其中最大的元素是在第一個地方(或最短的地方)。 只用這個替換: '外部,內部=內部,外部' 用這個: 'array [outer_index],array [inner_index] = array [inner_index],array [outer_index]' 不排序數組「案例情景「。 我需要更深入地分析現在和將來發生的事情。 謝謝。 – ToTenMilan

2

你交換的局部變量只

outer, inner = inner, outer 

這不會修改array,改變陣列必須使用[]=

array[n] = value 
相關問題