交换数组中的元素而不创建新数组

时间:2019-05-28 09:00:19

标签: arrays ruby

有人要求我提供一种方法,如果要把元素== 5推到数组的末尾,而不是将5推到arr的开头,必须返回arr,而不必创建新数组 您能否通过迭代每个帮助我解决这一问题 另一个没有.each 使用红宝石

Ruby,请

结束

放入put_num5_last([5,3,5,2,5,1,4])

2 个答案:

答案 0 :(得分:0)

您可以使用Array的sort_by!方法。

在ruby中有一个命名约定,以!结尾的方法是就地破坏性,即它们修改了接收方。

sort_by将返回一个新数组(已排序),sort_by!将对该数组进行原位排序。

input = [6, 5, 3, 5, 2, 5, 1, 4]

output = input.sort_by! do |a, b|
  if a == 5
    1
  else
    -1
  end
end

p input     #=> [4, 2, 1, 6, 3, 5, 5, 5]
p output    #=> [4, 2, 1, 6, 3, 5, 5, 5]
p input.object_id   #=> 70191237292740
p output.object_id  #=> 70191237292740
p input.object_id == output.object_id #=> true

答案 1 :(得分:0)

您可以将五分之一的鱼捞出,并连接到最后。

numbs = [5, 3, 5, 2, 5, 1, 4]
fives = numbs.select { |numb| numb == 5 }
numbs.delete(5)
numbs.concat(fives)

numbs #=> [3, 2, 1, 4, 5, 5, 5]

这不是最有效的解决方案,因为selectdelete都会遍历整个数组。但这是最易读的。效率更高,但可读性更低:

numbs = [5, 3, 5, 2, 5, 1, 4]

# reverse loop to prevent shifting of elements that are not yet iterated
numbs.each_index.reverse_each do |index|
  next unless numbs[index] == 5
  numbs << numbs.delete_at(index)
end

numbs #=> [3, 2, 1, 4, 5, 5, 5] 

以上仅在数组上循环一次,将值从数组中删除并将其附加到末尾。