设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2314|回复: 6
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
帖子
51
跳转到指定楼层
1
发表于 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改变了?怎样才是正确的方法?

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

2
发表于 2012-3-11 14:46:25 | 只看该作者
本帖最后由 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]

复制代码
������

点评

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
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
508
在线时间
1478 小时
注册时间
2011-9-17
帖子
1316

开拓者贵宾

3
发表于 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
回复

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

4
发表于 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
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
508
在线时间
1478 小时
注册时间
2011-9-17
帖子
1316

开拓者贵宾

5
发表于 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
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
帖子
51
6
 楼主| 发表于 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被改变。怎么回事?
回复

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

7
发表于 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
回复

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-24 03:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表