Project1

标题: 怎样安全地把一个数组复制到另一个数组? [打印本页]

作者: 受pia专用ID    时间: 2012-3-11 14:31
标题: 怎样安全地把一个数组复制到另一个数组?
怎样安全地把一个数组复制到另一个数组,然后改动那个数组,原数组不变?
我试过把array_input的数据复制到array,但之后的操作,使array_input发生了变化。我用的方法如下:
array = []
for i in 0...array_input.size
  array[i] = array_input[i]
end
之后都没有出现过array_input,但为何却使array_input改变了?怎样才是正确的方法?dsu_plus_rewardpost_czw
作者: orzfly    时间: 2012-3-11 14:46
本帖最后由 orzfly 于 2012-3-11 15:03 编辑

Ruby里面到处都是引用……
请用此卖萌deepcopy
RUBY 代码复制
  1. def deepcopy(input)
  2.   begin Marshal.load Marshal.dump input rescue input.map { |i| i.is_a?(Array) ? deepcopy(i) : (begin i.clone rescue i end) } end
  3. end
  4.  
  5. top=binding;puts <<_EOC.split("\n").map{|i|"#{i}\n=>#{top.eval i}\n\n"}.join
  6. a=[[[11,2],3],4]
  7. a
  8. b=deepcopy(a)
  9. b[0][0][0]=12
  10. b
  11. a
  12. _EOC
  1. a=[[[11,2],3],4]
  2. =>[[[11, 2], 3], 4]

  3. a
  4. =>[[[11, 2], 3], 4]

  5. b=deepcopy(a)
  6. =>[[[11, 2], 3], 4]

  7. b[0][0][0]=12
  8. =>12

  9. b
  10. =>[[[12, 2], 3], 4]

  11. a
  12. =>[[[11, 2], 3], 4]

复制代码
������
作者: iisnow    时间: 2012-3-11 14:49
本帖最后由 iisnow 于 2012-3-11 15:05 编辑

简单一点的办法:
  1. array = array_input.clone
复制代码
  1. arry_input = [1,2,0,4]
  2. arry = arry_input.clone
  3. arry[2] = 3
  4. msgbox arry_input  #=> [1,2,0,4]
  5. msgbox arry  #=> [1,2,3,4]
复制代码

作者: orzfly    时间: 2012-3-11 15:04
本帖最后由 orzfly 于 2012-3-11 15:05 编辑
iisnow 发表于 2012-3-11 14:49
简单一点的办法:


please try this
  1. a=[[1]]
  2. =>[[1]]

  3. a
  4. =>[[1]]

  5. b=a.clone
  6. =>[[1]]

  7. b[0][0]=2
  8. =>2

  9. b
  10. =>[[2]]

  11. a
  12. =>[[2]]

复制代码

作者: iisnow    时间: 2012-3-11 15:07
本帖最后由 iisnow 于 2012-3-11 15:15 编辑
orzfly 发表于 2012-3-11 15:04
please try this
  1. a = [[0]]
  2. b = []
  3. b[0] = a[0].clone
  4. b[0][0] = 2
复制代码
那就这样啊

尽量简单吧,毕竟知道需要复制的数组,根据那个结构来就行了啊
作者: 受pia专用ID    时间: 2012-3-11 15:56
本帖最后由 受pia专用ID 于 2012-3-11 15:57 编辑

还是不对,我把代码整个发上来吧。
这个代码的目的是做到运算排序,例子如下:
p Math.put_in_order_array_1(%w(2 + 1)) #=>["1","+","2"]
p Math.put_in_order_array_1(%w(4 - 3 + 2)) #=>["2","+","4","-","3"]
下面是代码
  1.   def self.put_in_order_array_1(array_input)#无括号的部分
  2.     array = array_input.clone
  3.     times_array = Array.new
  4.     t = 0
  5.     times_array[t] = []
  6.     for i in 0...array.size
  7.       if array[i] == "+" or array[i] == "-"
  8.         t+=1
  9.         times_array[t] = [array[i]]
  10.         t+=1
  11.         times_array[t] = []
  12.       else
  13.         times_array[t] << array[i]
  14.       end
  15.     end
  16.     for i in 0...times_array.size
  17.       times_array[i] = put_in_order_array_1_1(times_array[i])
  18.     end
  19.     returns = put_in_order_array_1_2(times_array)
  20.     return returns
  21.   end
  22.   def self.put_in_order_array_1_1(input0)#以array输入   */计算排序(无括号)
  23.     input = input0.clone
  24.     if input.class != Array
  25.       return input
  26.     end

  27.     timers = [input[0]]
  28.     dividers = []
  29.     for i in 1..(input.size-1)/2
  30.       if input[i*2-1] == "*"
  31.         timers << input[i*2]
  32.       elsif input[i*2-1] == "/"
  33.         dividers << input[i*2]
  34.       end
  35.     end
  36.     dividers = quick_soft(dividers)
  37.     timers = quick_soft(timers)
  38.     returns = timers[0]
  39.    
  40.     for i in 1...timers.size
  41.       next unless timers[i]
  42.       returns << "*"
  43.       returns << timers[i]
  44.     end
  45.     for i in 0...dividers.size
  46.       next unless dividers[i]
  47.       returns << "/"
  48.       returns << dividers[i]
  49.     end
  50.     return returns
  51.   end
  52.   def self.put_in_order_array_1_2(input)#以array输入   +-计算排序(无括号)
  53.     addtions = [input[0]]
  54.     minus = []
  55.     for i in 1..(input.size-1)/2
  56.       if input[i*2-1] == "+"
  57.         addtions << input[i*2]
  58.       elsif input[i*2-1] == "-"
  59.         minus << input[i*2]
  60.       end
  61.     end
  62.     minus = quick_soft(minus)
  63.     addtions = quick_soft(addtions)
  64.     returns = addtions[0]
  65.     for i in 1...addtions.size
  66.       next unless addtions[i]
  67.       returns << "+"
  68.       returns << addtions[i]
  69.     end
  70.     for i in 0...minus.size
  71.       next unless minus[i]
  72.       returns << "-"
  73.       returns << minus[i]
  74.     end
  75.     return returns
  76.   end
复制代码
然后执行下列代码
  1. a = %w(1 2 3 4 5 6 7 8 9 hyo dtu ouy reyt ikguy fef66 87g uitg67 ur)
  2. c = %w(+ - * /)
  3. x = rand(18)
  4. s = []
  5. s << a[x]
  6. 15.times{
  7.   s << c[rand(4)]
  8.   s << a[rand(18)]
  9. }
  10. p(s,"                                    ",Math.put_in_order_array_1(s))
复制代码
显示出来后面的还好,前面原来的s被改变。怎么回事?
作者: orzfly    时间: 2012-3-11 16:41
把array = array_input.clone
换成我那个array=deepcopy(array_input)试试吧




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1