arrays - Ruby - 将数组元素移动到给定位置

标签 arrays ruby sorting element

因此,我想通过传递到方法中的条件参数引用特定位置来移动数组的给定元素。

例如,如果我有一个数组

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

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

def move_element(a, right_of: d)

end

这可以通过 Ruby 中的给定数组方法实现吗?如果是这样我就不熟悉了。

提前干杯

最佳答案

我们得到:

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']

关于arrays - Ruby - 将数组元素移动到给定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64814991/

相关文章:

c - 不是一切都在它应该在的地方,为什么会出现段错误?

c - 如何在c编程中用其出现次数(频率)替换二维数组元素

c - sprintf(array, "%4d\n", int),将其转回 int

ruby - Textmate Cucumber "Undefined Step"即使它存在

ruby - $ GEM_HOME和$ GEM_PATH在旅客中设置错误

javascript - JS 比较两个对象数组,并排除匹配值的元素到新数组中

mysql - 如何用 Ruby 编写跨平台设置脚本

根据顺序不同的字符向量替换数据框中的列名称

python - 递归算法中Python列表的可变性

javascript - 在由不同颜色的立方体组成的网格中,如何找到匹配的簇?