【问题标题】:Ruby - Move element of array to given position [closed]Ruby - 将数组元素移动到给定位置[关闭]
【发布时间】:2021-02-25 02:41:02
【问题描述】:

我想通过传递给方法的条件参数引用特定位置来有效地移动数组的给定元素。

例如,如果我有一个数组

array = [a, b, c, d, f, g]

并按照此方法创建了一个以键值对作为条件的方法

def move_element(a, right_of: d)

end

在 Ruby 中使用给定的数组方法是否可行?如果是这样,我不熟悉它。

提前干杯

【问题讨论】:

  • 您需要编辑以制作 ab、... Ruby 对象。假设它们是字符串,您需要将它们放在引号中。
  • 在您的示例中,没有元素 a 位于元素 d 的右侧,因此完全不清楚您期望的结果是什么。此外,你只说你想“移动元素”,但你从来没有说你想把它移动到哪里。请确保您提供清晰、准确、明确、完整、客观的说明,说明您想要实现的目标,包括任何和所有规则、例外、特殊情况、极端情况和边缘情况。另外,请以 valid Ruby 代码的形式提供所有输入和输出的示例。
  • 提问时,如果您的示例代码有效,您将获得更好的结果。尝试将您的代码放入一个文件并运行它。

标签: arrays ruby sorting element


【解决方案1】:

我们得到:

arr = ['a', 'b', 'c', 'd', 'f', 'g']

最初我假设您希望修改(变异)arr(而不是创建一个新数组并保持arr 不受干扰)。后来我构造了一个不会变异的方法arr

让我们首先构造一个方法,该方法将要移动的元素的索引、要跟随的元素的索引,当然还有数组作为参数:

def move_position(arr, n1, right_of:)
  arr.insert(right_of, arr.delete_at(n1))
end

试试看。

move_position(arr, 1, right_of: 3)
  #=> ["a", "c", "d", "b", "f", "g"]
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 0, right_of: 3)
  #=> ["b", "c", "d", "a", "f", "g"] 
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 0, right_of: 5)
  #=> ["b", "c", "d", "f", "g", "a"] 
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 0, right_of: 0)
  #=> ["a", "b", "c", "d", "f", "g"] 

Array#index。请注意arr.index(i,o) 在索引i 处插入o 之前 元素,但因为

a = arr.delete_at(n1)

在之前执行

arr.insert(right_of, a)

o 插入 最初位于索引 i 的元素之后。

注意right_of:

def move_position(arr, n1, right_of:)

指定:right_of 的值是一个必需的 变量(没有默认值,当使用right_of: 3 时)。 命名参数(或参数)是在 Ruby v2.0 中引入的。在 Ruby v2.1 中添加了使命名参数成为必需的语法。


现在创建一个方法,用在这些索引处找到的元素替换这两个索引。当然,这仅在涉及的两个元素在数组中是唯一的情况下才有效。

def move_element(arr, e1, right_of:)
  move_position(arr, arr.index(e1), right_of: arr.index(right_of))
end

这个这个方法。

arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'b', right_of: 'd')
  #=> ["a", "c", "d", "b", "f", "g"] 
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'a', right_of: 'd')
  #=> ["b", "c", "d", "a", "f", "g"] 
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'a', right_of: 'g')
  #=> ["b", "c", "d", "f", "g", "a"] 
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_element(arr, 'a', right_of: 'a')
  #=> ["a", "b", "c", "d", "f", "g"]

如果您不想改变arr,您可以编写以下内容:

def move_position(arr, n1, right_of:)
  arr.each_index.map do |i|
    case i
    when 0..n1-1, (right_of+1)..arr.size-1
      arr[i]
    when n1..right_of-1
      arr[i+1]
    when right_of
      arr[n1]
    end
  end
end
arr = ['a', 'b', 'c', 'd', 'f', 'g']
move_position(arr, 1, right_of: 3)
  #=> ["a", "c", "d", "b", "f", "g"] 
move_position(arr, 0, right_of: 3)
  #=> ["b", "c", "d", "a", "f", "g"]
move_position(arr, 0, right_of: 5)
  #=> ["b", "c", "d", "f", "g", "a"] 
move_position(arr, 0, right_of: 0)
  #=> ["a", "b", "c", "d", "f", "g"] 

确认arr没有被变异:

arr
  #=> ["a", "b", "c", "d", "f", "g"]

move_element 不变:

move_element(arr, 'b', right_of: 'd')
  #=> ["a", "c", "d", "b", "f", "g"] 
move_element(arr, 'a', right_of: 'd')
  #=> ["b", "c", "d", "a", "f", "g"] 
move_element(arr, 'a', right_of: 'g')
  #=> ["b", "c", "d", "f", "g", "a"] 
move_element(arr, 'a', right_of: 'a')
  #=> ['a', 'b', 'c', 'd', 'f', 'g']
arr
  #=> ['a', 'b', 'c', 'd', 'f', 'g']

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 2011-07-15
    • 2023-03-29
    • 2018-10-15
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多