【问题标题】:How do you move an array into another and leave the first one empty?你如何将一个数组移动到另一个数组中并将第一个数组留空?
【发布时间】:2014-02-02 03:21:52
【问题描述】:

我正在寻找一种将一个数组移动到另一个数组并清空它的方法。在这个例子中:

a1 = [1,2]
a2 = [3,4]

我想将 a2 添加到 a1,然后将 a2 添加为空。我希望结果看起来像:

a1 # => [1, 2, 3, 4]
a2 # => []

数组的大小可以不同,所以我需要一些不是特定于一个元素的东西,比如 push/pop/shift/unshift。或者也许我没有正确使用这些。我做了以下,但想知道是否有更好的方法:

a1.concat(a2)
a2.clear
a1 # => [1, 2, 3, 4]
a2 # => [3, 4]

【问题讨论】:

  • 糟糕,我写了一个答案(现已删除),然后才意识到这正是您已经尝试过的。老实说,我认为这是最简单的方法——在第二行使用#clear
  • 感谢大家的 cmets 和解决方案。我对这个网站很陌生。我不想因为提出这个问题而受到惩罚……但我不明白为什么我的问题被否决为“-1”。再次感谢您的所有帮助!
  • 谁知道为什么有人反对它。对我来说似乎是一个合理的问题。我投票赞成补偿。 :-)
  • 顺便说一句,我在删除的答案中写的是“如果a2.clear 返回了清空的元素,那将是一个简单的单行。但它没有,所以我会分两次做。我认为你所做的比使用slice! 的解决方案更干净,即使它需要额外的一行。
  • Kal - 感谢您的评论和投票!我在发布之前阅读了所有规则,并试图在我的问题中格外小心。我只是想确保我没有无意中违反规则。再次感谢!

标签: ruby arrays merge


【解决方案1】:
a1.concat(a2.slice!(0..-1))

将在一行中为您提供所需的内容。 slice! 方法将从一个数组中获取所有内容并将其添加到另一个数组中。

a1 = [1,2]
a2 = [3,4]
a1.concat(a2.slice!(0..-1)) # => [1, 2, 3, 4] 
a2 # => [] 

【讨论】:

  • 在没有 Ruby 2.1.0 中的所有括号的情况下也可以正常工作:a1.concat a2.slice! 0..-1。您的回答非常简洁,因此我喜欢它;但是,bang 方法有时会返回 nil 并破坏更长的方法链,因此我个人建议使用一组更明确的赋值。 YMMV。
  • 谢谢。在某些情况下,我更喜欢括号,只是为了更清楚地说明其他人正在发生的事情。零回报很有趣,我没有想到这一点。能举个例子吗?
  • 只要索引超出范围,slice! 将返回 nil。以下链将在调用 Array#first 时引发 NoMethodError:a1 = [1,2]; a2 = [3,4]; a2.slice!(50).first
【解决方案2】:

使用串联

使用Array#+ 连接数组并将结果分配给a1,然后设置a2 等于一个空数组。例如:

a1  = [1,2]
a2  = [3,4]
a1 += a2
a2  = []

a1
# => [1, 2, 3, 4]
a2
# => []

【讨论】:

  • 我也会这样做。这和Caroleen建议的一样,只是表达方式不同。我不明白将两个超简单语句组合成一个需要 5.0 秒而不是 0.5 秒来理解的语句。
  • @CarySwoveland Array#concat 附加到 self,而 Array#+ 返回一个新数组。这对 OP 来说无关紧要,但对于未来的访问者来说,这是一个值得注意的区别。然而,我同意你的观点:清晰胜过简洁,除非是打代码高尔夫。 :)
【解决方案3】:

您可能会查看班次或切片!方法。两者都将在删除后返回一个数组块。

如果您知道要移出数组前面的值的数量,则可以这样做:

a1.concat(a2.shift(2))

或者,如果你想切出整个数组,这可行:

a1.concat(a2.slice!(0..-1))

0..-1的范围是指第一个元素到最后一个元素。

【讨论】:

  • 你可以用shift(a2.size)替换shift(2),当然你也可以写成a1 += a2.shift(a2.size)
  • 您的slice 不会从a2 数组中删除元素。你需要bang方法slice!
  • @beartech 是的。转变意味着改变。 Shift 不是没有 !。更新答案。
猜你喜欢
  • 2018-12-20
  • 2013-06-05
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多