查看: 2562|回复: 6

[已经解决] 怎样安全地把一个数组复制到另一个数组?

[复制链接]
梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
回帖
25
发表于 2012-3-11 14:31:05 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
怎样安全地把一个数组复制到另一个数组,然后改动那个数组,原数组不变?
我试过把array_input的数据复制到array,但之后的操作,使array_input发生了变化。我用的方法如下:
array = []
for i in 0...array_input.size
  array[i] = array_input[i]
end
之后都没有出现过array_input,但为何却使array_input改变了?怎样才是正确的方法?

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-3-11 14:46:25 | 显示全部楼层
本帖最后由 orzfly 于 2012-3-11 15:03 编辑

Ruby里面到处都是引用……
请用此卖萌deepcopy
[pre lang="ruby"]def deepcopy(input)
  begin Marshal.load Marshal.dump input rescue input.map { |i| i.is_a?(Array) ? deepcopy(i) : (begin i.clone rescue i end) } end
end

top=binding;puts <<_EOC.split("\n").map{|i|"#{i}\n=>#{top.eval i}\n\n"}.join
a=[[[11,2],3],4]
a
b=deepcopy(a)
b[0][0][0]=12
b
a
_EOC[/pre]
  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]

复制代码
������

点评

clone不会连带着改变啊,我试过了啊  发表于 2012-3-11 15:03

评分

参与人数 1星屑 +200 收起 理由
iisnow + 200 长见识了,不愧是打神啊~~

查看全部评分

我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

梦石
0
星屑
513
在线时间
1479 小时
注册时间
2011-9-17
回帖
1266

开拓者贵宾

发表于 2012-3-11 14:49:45 | 显示全部楼层
本帖最后由 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]
复制代码

点评

汝这个和楼主的有嘛区别……  发表于 2012-3-11 15:00
我帖子中要有是不HX的空白,请Ctrl + A
回复

使用道具 举报

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-3-11 15:04:47 | 显示全部楼层
本帖最后由 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]]

复制代码
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

梦石
0
星屑
513
在线时间
1479 小时
注册时间
2011-9-17
回帖
1266

开拓者贵宾

发表于 2012-3-11 15:07:45 | 显示全部楼层
本帖最后由 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
复制代码
那就这样啊

尽量简单吧,毕竟知道需要复制的数组,根据那个结构来就行了啊

点评

关键是新人看懂啊↓=。=  发表于 2012-3-11 15:17
用通用的方法不是更方便= =b 反正我是这么认为的  发表于 2012-3-11 15:16
我帖子中要有是不HX的空白,请Ctrl + A
回复

使用道具 举报

梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
回帖
25
 楼主| 发表于 2012-3-11 15:56:35 | 显示全部楼层
本帖最后由 受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被改变。怎么回事?
回复

使用道具 举报

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-3-11 16:41:41 | 显示全部楼层
把array = array_input.clone
换成我那个array=deepcopy(array_input)试试吧

点评

你那个deepcopy很好用,不过定义的代码没看懂,能解释下吗?  发表于 2012-7-1 16:34
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部