在Swift中使用分区将一些预定义的元素移动到数组的末尾

时间:2018-08-07 13:51:22

标签: swift dynamic-programming partition

我想使用Array.partition(by:)将一些预定义元素从数组移到数组的末尾。

示例:

var my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let elementsToMove = [1, 3, 4, 5, 8]
// desired result: [0, 2, 6, 7, 9, ...remaining items in any order...]

是否有一种优雅的方法?请注意,elementsToMove没有遵循某种模式。

2 个答案:

答案 0 :(得分:1)

partition(by:)不保留元素的顺序:

var my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let elementsToMove = [1, 3, 4, 5, 8]

_ = my_array.partition(by: { elementsToMove.contains($0) } )
print(my_array) // [0, 9, 2, 7, 6, 5, 4, 3, 8, 1]

一个简单的解决方案是从中过滤出并追加元素 第二个数组:

let my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let elementsToMove = [1, 3, 4, 5, 8]

let newArray = my_array.filter({ !elementsToMove.contains($0) }) + elementsToMove
print(newArray) // [0, 2, 6, 7, 9, 1, 3, 4, 5, 8]

对于较大的数组,最好创建一个 set 首先要移动的元素:

let my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let elementsToMove = [1, 3, 4, 5, 8]

let setToMove = Set(elementsToMove)
let newArray = my_array.filter({ !setToMove.contains($0) }) + elementsToMove
print(newArray) // [0, 2, 6, 7, 9, 1, 3, 4, 5, 8]

答案 1 :(得分:0)

如果您的my_array中有唯一的对象,则可以尝试类似的操作。

var my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var tempArray = my_array //Preserve original array
let elementsToMove = [1, 3, 4, 5, 8]
let p = tempArray.partition(by: elementsToMove.contains)

//Now sort first part of tempArray on basis of your my_array to get order you want
let newArray = tempArray[0..<p].sorted(by: { my_array.index(of: $0)! < my_array.index(of: $1)! }) + tempArray[p...]
print(newArray)

输出

[0, 2, 6, 7, 9, 5, 4, 3, 8, 1]