有人要求我提供一种方法,如果要把元素== 5推到数组的末尾,而不是将5推到arr的开头,必须返回arr,而不必创建新数组 您能否通过迭代每个帮助我解决这一问题 另一个没有.each 使用红宝石
Ruby,请
结束
放入put_num5_last([5,3,5,2,5,1,4])
答案 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]
这不是最有效的解决方案,因为select
和delete
都会遍历整个数组。但这是最易读的。效率更高,但可读性更低:
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]
以上仅在数组上循环一次,将值从数组中删除并将其附加到末尾。